【问题标题】:Filter multiple dataframes with criteria from list using loop使用循环从列表中过滤具有条件的多个数据帧
【发布时间】:2021-08-21 01:09:38
【问题描述】:

下面的代码创建了多个从 report2 列表命名的空数据框。然后使用过滤后的现有数据框填充它们,称为 dfsource。 使用嵌套的 for 循环,我想使用值列表过滤这些数据帧中的每一个,但子循环不起作用,如图所示。

import pandas as pd

report=['A','B','C']
suffix='_US'

report2=[s + suffix for s in report]
print (report2) #result: ['A_US', 'B_US', 'C_US']

source = {'COL1': ['A','B','C'], 'COL2': ['D','E','F']}
dfsource=pd.DataFrame(source)
print(dfsource)

df_dict = {}
for i in report2:
    df_dict[i]=pd.DataFrame()

    for x in report:
      df_dict[i]=dfsource.query('COL1==x')
      #df_dict[i]=dfsource.query('COL1=="A"') #Example, this works filtering for value A but not what I need.

print(df_dict['A_US'])
print(df_dict['B_US'])
print(df_dict['C_US'])

【问题讨论】:

  • 您的预期输出是什么样的?

标签: python pandas dataframe loops for-loop


【解决方案1】:

您可以使用@来引用查询中的变量

df_dict[i]=dfsource.query('COL1==@x')

所以总的代码是这样的

import pandas as pd

report=['A','B','C']
suffix='_US'

report2=[s + suffix for s in report]
print (report2) #result: ['A_US', 'B_US', 'C_US']

source = {'COL1': ['A','B','C'], 'COL2': ['D','E','F']}
dfsource=pd.DataFrame(source)
print(dfsource)

df_dict = {}
for i in report2:
    df_dict[i]=pd.DataFrame()


    for x in report:
      df_dict[i]=dfsource.query('COL1==@x')
      #df_dict[i]=dfsource.query('COL1=="A"') #Example, this works filtering for value A but not what I need.

print(df_dict['A_US'])
print(df_dict['B_US'])
print(df_dict['C_US'])

哪个输出

  COL1 COL2
0    A    D
1    B    E
2    C    F
  COL1 COL2
2    C    F
  COL1 COL2
2    C    F
  COL1 COL2
2    C    F

但是,我认为您想根据每个列表的 ix 创建一个新字典,然后您可以将数据框的创建移动到第二个 for 循环,然后为每个列表创建一个新键迭代。

import pandas as pd

report=['A','B','C']
suffix='_US'

report2=[s + suffix for s in report]
print (report2) #result: ['A_US', 'B_US', 'C_US']

source = {'COL1': ['A','B','C'], 'COL2': ['D','E','F']}
dfsource=pd.DataFrame(source)
print(dfsource)

df_dict = {}
for i in report2:
    for x in report:
      new_key = x + i
      df_dict[new_key]=pd.DataFrame()
      df_dict[new_key]=dfsource.query('COL1==@x')

for item in df_dict.items():
    print(item)

输出 9 个唯一的数据帧,这些数据帧根据传递的 x 值进行过滤。

('AA_US',   COL1 COL2
0    A    D)
('BA_US',   COL1 COL2
1    B    E)
('CA_US',   COL1 COL2
2    C    F)
('AB_US',   COL1 COL2
0    A    D)
('BB_US',   COL1 COL2
1    B    E)
('CB_US',   COL1 COL2
2    C    F)
('AC_US',   COL1 COL2
0    A    D)
('BC_US',   COL1 COL2
1    B    E)
('CC_US',   COL1 COL2
2    C    F)

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 2022-09-26
    • 2023-03-11
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2019-04-01
    • 2016-11-16
    相关资源
    最近更新 更多