【问题标题】:Iterating over a list made up of distinct dataframes迭代由不同数据框组成的列表
【发布时间】:2021-01-15 15:04:35
【问题描述】:

假设我有一个由 3 个数据框组成的列表,即

lst = [df1,df2,df3]

地点:

d1 = {'col1':['a','b','c','d','e']}
df1= pd.DataFrame(d1)
d2 = {'col1':['b','c','a','d','e']}
df2= pd.DataFrame(d2)
d3 = {'col1':['b','c','e','d','a']}
df3= pd.DataFrame(d3)

对于lst 中的每个df,我想通过col1 并找到字母a 的等级并从中创建一个新的数据框,输出应如下所示:

  dataframe index  rank of a
0                0          0
1                1          2
2                2          4

即,对于df1,字母a在第0个索引,对于df2,字母a在第2个索引,依此类推。我想知道这是怎么做到的?

我试过了:

ll = []
for i in lst:
    x = i[i['col1'].isin(['a'])]
    ll.append(x)

提取a的行列,然后我试了

lll = []
for i in ll:
    x = ll[i][0]
    lll.append(x)

这不起作用,我认为我的方法通常不是最好的方法。

【问题讨论】:

    标签: python pandas for-loop


    【解决方案1】:

    试试:

    pd.DataFrame({
        'df': range(len(lst)),
        'rank_of_a': [df['col1'].eq('a').idxmax() for df in lst]
    })
    

    输出:

       df  rank_of_a
    0   0          0
    1   1          2
    2   2          4
    

    【讨论】:

      【解决方案2】:

      你可以有一个简单的循环来遍历你的 dfs:

      rank_a = []
      for df in lst:
          rank_a.append(df[df.col1 == "a"].index[0])
      
      # rank_a = [0,2,4]
      

      这个想法是过滤 col1 中带有“a”的行并使用索引进行排名。上面的代码假设“a”总是 col1,所以取第一个。 只要 dfs 有默认索引,就可以了,如果没有,您可以随时重置索引。

      然后构造你的最终df:

      rank_df = pd.DataFrame({
          "dataframe index": range(len(lst)),
          "rank of a": rank_a
      })
      

      【讨论】:

        猜你喜欢
        • 2018-11-30
        • 2020-04-01
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 2017-12-23
        • 2021-07-10
        • 1970-01-01
        • 2017-08-04
        相关资源
        最近更新 更多