【问题标题】:python: loop through list of dataframes and list of listspython:循环遍历数据框列表和列表列表
【发布时间】:2021-08-31 13:32:33
【问题描述】:

我有一个数据框列表 (lst_dfs),我想使用部分列名列表 (lst) 对其中的列进行子集化。列的列表需要与 startswith 一起应用,因为有时标识符的结尾不同。数据框列表的索引与名称列表的索引匹配。它很容易用一个数据框应用,但不能用这个列表/循环。 预期的输出将是一个字典,其中包含两个数据帧的列表,其中包含子集列,但它返回空。我认为我的迭代级别不正确(除其他外?)。非常感谢任何帮助。非常感谢!

我放入列表的两个数据框

df1 = pd.DataFrame(data={'x':[1,2,3,4,5], 
                         'am.1': [1,1,1,1,1],
                         'abn.1': [1,1,1,1,1],
                         'b1c': [1,1,1,1,1],
                         'b1d': [1,1,1,1,1]})

df2 = pd.DataFrame(data={'x':[1,2,3,4,5], 
                         'am.1': [1,1,1,1,1],
                         'am.1': [1,1,1,1,1],
                         'al.2': [1,1,1,1,1],
                         'b1d': [1,1,1,1,1],
                         'b2d': [1,1,1,1,1]})

lst_dfs = [df1, df1]

lst = (['a','b'],['am','b1'])
dat={}
for i, df in enumerate(lst_dfs):
    for elem in lst:
        print(elem)
        dat[i] = df.loc[(df.columns.str.startswith(str(elem)))]

【问题讨论】:

标签: python pandas dataframe loops pandas-loc


【解决方案1】:

使用df.filterregex 参数过滤掉以列表中的元素开头的列:

from collections import defaultdict
dat = defaultdict(list)

for i, df in enumerate(lst_dfs):
    for elem in lst:
        dat[i].append(df.filter(regex='^('+'|'.join(elem)+')', axis=1))

输出:

>>> dat[0]
[   am.1  abn.1  b1c  b1d
0     1      1    1    1
1     1      1    1    1
2     1      1    1    1
3     1      1    1    1
4     1      1    1    1,    am.1  b1c  b1d
0     1    1    1
1     1    1    1
2     1    1    1
3     1    1    1
4     1    1    1]

【讨论】:

  • 感谢您的回复。没有它附加所有原始列而不是对它们进行子集
  • 它应该可以工作。原始df中的列名是什么?它适用于您在问题中发布的示例 df(请参阅输出)。
猜你喜欢
  • 1970-01-01
  • 2018-10-26
  • 2019-04-15
  • 2021-02-08
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
相关资源
最近更新 更多