假设我有以下两个 pandas.DataFrame
、df0
和 df1
:
import pandas as pd
# 1st data set
dat0 = [['A0', 'B0', 'C0', 'case0', 1],
['A0', 'B2', 'C0', 'case0', 2],
['A1', 'B0', 'C0', 'case0', 3],
['A1', 'B1', 'C0', 'case0', 4],
['A0', 'B0', 'C1', 'case0', 5]]
df0 = pd.DataFrame(dat0, columns=['colA', 'colB', 'colC', 'colCase', 'colVal'])
# 2nd data set
dat1 = [['A0', 'B1', 'C2', 'case1', 6],
['A0', 'B2', 'C2', 'case1', 7],
['A1', 'B0', 'C2', 'case1', 8],
['A2', 'B2', 'C2', 'case1', 9]]
df1 = pd.DataFrame(dat1, columns=['colA', 'colB', 'colC', 'colCase', 'colVal'])
我试图获取对于每对列(A、B)都有 case0 和 case1 值(即每个 DF 中的值)的所有行。
如果重要的话,我不能在 DataFrame 中包含“重复”行:集合(A、B、C、case)在每个 DF 中都是唯一的。
所以我想得到一个看起来像这样的代码:
# Merge the DataFrames
df = pd.concat([df0, df1]) # maybe concat is not a good starting point
for a in ['A0', 'A1', 'A2']:
for b in ['B0', 'B1', 'B2']:
table = my_great_function(df, a, b)
if table:
print '---'
print table
并得到以下结果:
---
colA colB colC colCase colVal
1 A0 B2 C0 case0 2
1 A0 B2 C2 case1 7
---
colA colB colC colCase colVal
2 A1 B0 C0 case0 3
2 A1 B0 C2 case1 8
注意,我不想得到只出现一行的结果,也不想得到两行或更多行具有相同大小写的结果。
有什么建议吗?
最佳答案
你可以做类似的事情。如果这不完全是您想要的,请相应地修改条件(这里每个 g 代表具有 colA 和 colB 的唯一组合的子数据框):
for _, g in df.groupby(["colA", "colB"]):
case_lst = g.colCase.tolist()
if 'case0' in case_lst and 'case1' in case_lst:
print("--------")
print(g)
--------
colA colB colC colCase colVal
1 A0 B2 C0 case0 2
1 A0 B2 C2 case1 7
--------
colA colB colC colCase colVal
2 A1 B0 C0 case0 3
2 A1 B0 C2 case1 8
关于python - 当列匹配时过滤来自两个 pandas DataFrame 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41169561/