pandas 如何找到索引/行,其中列的组合等于另一个 Dataframe 的列

8dtrkrch  于 2023-05-27  发布在  其他
关注(0)|答案(2)|浏览(136)

我有两个 Dataframe 。第一个是行中有多个相同值的条目,另一个是每个列组合只有一行。我想得到第一个 Dataframe 的索引/行,其中列A,B和C在两个 Dataframe * 和 * 中 * 成对相等 *,其中第一个 Dataframe 中的列D等于n。列A、B和C是所有列的子集。我想指定只有那些列必须相等。使用这些索引,我想改变列E的值(简单地使用df.loc[indices,'E']='n'。
第一个是具有相同值的多个条目的条目。原始 Dataframe 具有日期戳,因此它没有多个完全相同的行。

A B C D E
0  a b c y y
1  a b c y y
2  b n m n y
3  b n m n y
4  b n m n y
5  t u j y y
6  t u j y y
7  t u j y y
8  e t y y y
9  e t y y y

第二个 Dataframe 每个条目只有一行,而不是列D和E,并且是第一个 Dataframe 中的条目的子集。

A B C
0  a b c
1  b n m
2  t u j

在该示例中,期望的输出是满足所有条件的索引的列表。

[2,3,4]

我尝试过合并,虽然它确实给予了我正确的行,但我没有得到正确的索引来更新第一个 Dataframe 。我还尝试了三列的MultiIndex,但我错过了D列的过滤器。
我如何才能做到这一点?

dsekswqp

dsekswqp1#

获得索引列表的一种方法是合并两个 Dataframe ,将索引作为一列添加到第一个 Dataframe ,并将'n'分配给第二个 Dataframe 中的D列,以便只有在ABC上匹配并且在D中具有'n'的行才匹配。然后,你可以从第一个索引列作为你的结果:

indices = (df1
    .reset_index(names='index')
    .merge(df2.assign(D='n'), on=['A', 'B', 'C', 'D'])['index']
    .to_list())

输出(用于示例数据):

[2, 3, 4]

请注意,to_list()不是绝对必要的,下面的代码没有它也能正常工作。
然后,您可以使用索引将E设置为'n'

df1.loc[indices, 'E'] = 'n'

输出:

A  B  C  D  E
0  a  b  c  y  y
1  a  b  c  y  y
2  b  n  m  n  n
3  b  n  m  n  n
4  b  n  m  n  n
5  t  u  j  y  y
6  t  u  j  y  y
7  t  u  j  y  y
8  e  t  y  y  y
9  e  t  y  y  y
3qpi33ja

3qpi33ja2#

假设df1df2,可以使用布尔索引:

# are the common columns (A/B/C) also in df2?
m1 = df1.merge(df2.assign(mask=True), how='left')['mask'].fillna(False)
# or
import numpy as np
m1 = np.isin(df1[df2.columns], df2).all(1)

# is "D" a "n"?
m2 = df1['D'].eq('n')

# if both conditions are True, update E
df1.loc[m1&m2, 'E'] = 'n'

输出:

A  B  C  D  E
0   a  b  c  y  y
1   a  b  c  y  y
2   b  n  m  n  n
3   b  n  m  n  n
4   b  n  m  n  n
5   t  u  j  y  y
6   t  u  j  y  y
7   t  u  j  y  y
8   e  t  y  y  y
9   e  t  y  y  y
10  e  t  y  n  y  # not updated

目标指标:

df1.index[m1&m2]
# Index([2, 3, 4], dtype='int64')

相关问题