我有以下数据集,这些数据集是日记账分录行(会计借方/贷方分录(
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)
您可以在此处使用transform
和any
:
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
如果filterfunction
为True,则将选择特定的数据子集,否则将删除该数据子集。
在您的情况下,您需要为Account中存在A
的每个(组(Entry
(索引(选择行
因此,我们的filterfunciton
将变成可以设置为lambda grp: grp['Account'].isin(['A']).any()
对于给定数据,
df.groupby(['Entry']).filter(lambda grp: grp['Account'].isin(['A']).any())