![](/img/trans.png)
[英]pandas- change [ row_x , col_d ] value to [raw_y, col_a] based on comparison of [raw_x, col_b] & [raw_y, col_c]
[英]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.