【问题标题】:How can I find rows in a pandas dataframe where value of col1 for row_x == value of col2 for row_y?如何在 pandas 数据框中找到 row_x 的 col1 值 == row_y 的 col2 值的行?
【发布时间】:2020-02-01 14:46:14
【问题描述】:

我有一个包含多列的 pandas 数据框。其中 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 列中的值不同。

【问题讨论】:

    标签: python pandas dataframe filter subset


    【解决方案1】:

    使用GroupBy 根据C 列进行分组。使用GroupBy.applySeries.isin 检查两个系列的共同值(AB), 那么您可以使用DataFrame.unstackDataFrame.any 来执行Boolean indexing

    new_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      C
    3  3  7  False
    5  5  5  False
    7  7  3  False
    

    回应您的评论:

    df['A'].isin(df['B'])
    
    0    False
    1    False
    2     True
    3     True
    4     True
    5     True
    6     True
    7     True
    8    False
    9    False
    Name: A, dtype: bool
    

    df['A']==df['B']        
    
    0    False
    1    False
    2    False
    3    False
    4    False
    5     True
    6    False
    7    False
    8    False
    9    False
    dtype: bool
    

    【讨论】:

    • 这是与您联系的唯一方式 ;)
    • @ansev 它有效!谢谢!你能澄清为什么 (x['A'].isin(x['B']) & x['B'].isin(x['A'])) 在这里工作吗?我最初认为答案应该是( lambda x: (x['A'] == x['B'] & x['B'] == x['A']) )
    • isin 用于比较 A 中的值是否也在 B 中,而不考虑索引
    • 我已经更新了我的答案,所以你可以看到==isin之间的区别
    • 如果我澄清了您的疑问,请告诉我。如果您能接受和/或投票我的回答,我将不胜感激
    【解决方案2】:

    关键是将数据框合并到自身,将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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 2019-05-22
      • 1970-01-01
      • 2018-06-13
      • 2021-02-24
      • 2016-08-12
      • 1970-01-01
      相关资源
      最近更新 更多