如果一组索引在另一列中具有相同的值,则筛选DataFrame



我有以下数据集,这些数据集是日记账分录行(会计借方/贷方分录(

Entry   Debit   Credit   Account
1        1                 A
1                1         B
2        2                 A
2                1         C
2                1         C
3        4                 C
3                1         G
3                1         A
3                1         D
3                1         K
4        1                 H
4                1         J

正如你所看到的,我们只有4个日记账,因为它们是由条目编号(索引(识别的。

我需要的是过滤所有包含账户A的日记账,而不是包含A的每一行。问题是,如果我按账户进行过滤,我只得到有账户A的行,但我丢失了不一定会使用账户A的其他行。

所以在应用过滤器之后,我应该得到这样的东西:

Entry   Debit   Credit   Account
1        1                 A
1                1         B
2        2                 A
2                1         C
2                1         C
3        4                 C
3                1         G
3                1         A
3                1         D
3                1         K

账户4将不会显示,因为没有包含账户A的条目(索引(。

设置:

d = {'Entry': {0: 1.0, 1: 1.0, 3: 2.0, 4: 2.0, 5: 2.0, 7: 3.0, 8: 3.0, 9: 
3.0, 10: 3.0, 11: 3.0, 13: 4.0, 14: 4.0}, 
'Debit': {0: 1.0, 1: np.nan, 3: 2.0, 4: np.nan, 5: np.nan, 7: 4.0, 8: np.nan, 
9: np.nan, 10: np.nan, 11: np.nan,13: 1.0, 14: np.nan}, 
'Credit': {0: np.nan, 1: 1.0, 3: np.nan, 4: 1.0, 5: 1.0, 7: np.nan,
8: 1.0, 9: 1.0, 10: 1.0, 
11: 1.0, 13: np.nan, 14: 1.0}, 
'Account': {0: 'A', 1: 'B', 3: 'A', 4: 'C', 5: 'C', 7: 'C', 8: 'G', 
9: 'A', 10: 'D', 11: 'K', 13: 'H', 14: 'J'}}
df = pd.DataFrame(d)

您可以在此处使用transformany

df[df['Account'].eq('A').groupby(df['Entry']).transform('any')]
#or df[df['Account'].eq('A').groupby(level=0).transform('any')] if Entry is index

Entry  Debit  Credit Account
0     1.0    1.0     NaN       A
1     1.0    NaN     1.0       B
3     2.0    2.0     NaN       A
4     2.0    NaN     1.0       C
5     2.0    NaN     1.0       C
7     3.0    4.0     NaN       C
8     3.0    NaN     1.0       G
9     3.0    NaN     1.0       A
10    3.0    NaN     1.0       D
11    3.0    NaN     1.0       K

Pandas Groupby为您提供了一个filter机制,该机制接受数据帧/组的一个子集和filterfunction

如果filterfunctionTrue,则将选择特定的数据子集,否则将删除该数据子集。

在您的情况下,您需要为Account中存在A的每个(组(Entry(索引(选择行

因此,我们的filterfunciton将变成可以设置为lambda grp: grp['Account'].isin(['A']).any()

对于给定数据,

df.groupby(['Entry']).filter(lambda grp: grp['Account'].isin(['A']).any())

最新更新