猿问

如何在 pandas 数据框中找到 row_x 的 col1 值 == row_y 的 col2

我有一个包含多列的熊猫数据框。这些列中的 2 列应该相等但在单独的行中,第三列应该在两行中相等。


例如,给定数据帧 df[A, B, C],找到 row_x 和 row_y 使得:


(df.iloc[x, A] == df.iloc[y, B]) and (df.iloc[x, B] == df.iloc[y, A]) and (df.iloc[x, C] == df.iloc[y, C])


有没有比遍历框架更好的方法来获取交换列的行?


A = [30,31]+list(range(2,8,1))+[38,39]

B = range(10,0,-1)

C = [True, False, True, False, False, False, True, False, True, False]


df = pd.DataFrame({'A': A, 'B': B, 'C': C})


Out[]: df

    A   B   C

0   30  10  True

1   31  9   False

2   2   8   True

3   3   7   False

4   4   6   False

5   5   5   False

6   6   4   True

7   7   3   False

8   38  2   True

9   39  1   False



Required output:

    A   B   C

3   3   7   False

5   5   5   False

7   7   3   False

只有第 3、5 和 7 行满足上述条件。我将进一步删除第 5 行,因为我对 A 列 = B 列的行不感兴趣。请注意,第 4 行和第 6 行也交换了 A 列和 B 列中的值,但 C 列中的值不同。


慕田峪9158850
浏览 138回答 2
2回答

大话西游666

使用GroupBy 根据列进行分组。使用 GroupBy.apply 和 Series.isinC检查两个系列(和) 的公共值,然后可以使用DataFrame.unstack和DataFrame.any进行布尔索引:ABnew_df=df[df.groupby('C').apply(lambda x: x['A'].isin(x['B'])&x['B'].isin(x['A'])).unstack().any()]print(new_df)   A  B      C3  3  7  False5  5  5  False7  7  3  False回应您的评论:df['A'].isin(df['B'])0    False1    False2     True3     True4     True5     True6     True7     True8    False9    FalseName: A, dtype: booldf['A']==df['B']        0    False1    False2    False3    False4    False5     True6    False7    False8    False9    Falsedtype: bool

摇曳的蔷薇

关键是将数据框合并到自身,将B列与A列匹配:df = df.merge(df.rename({'B': 'A', 'A': 'AfromB', 'C': 'CfromB'}, axis=1), how='left')df = df[(df['B'] == df['AfromB']) & (df['C'] == df['CfromB'])].drop(['AfromB', 'CfromB'], axis=1)
随时随地看视频慕课网APP

相关分类

Python
我要回答