繁体   English   中英

如何在 pandas dataframe 中找到行,其中 row_x 的 col1 值 == row_y 的 col2 值?

[英]How can I find rows in a pandas dataframe where value of col1 for row_x == value of col2 for row_y?

我有一个多列的 pandas dataframe。 这些列中的 2 列应该相等但在单独的行中,第三列应该在两行中相等。

例如,给定 dataframe 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 列中的值不同。

Use GroupBy to group based on column C .Use GroupBy.apply and Series.isin to check the common values of both series ( A and B ), then you can use DataFrame.unstack with DataFrame.any to perform a 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

关键是将dataframe合并到自身,匹配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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM