【问题标题】:Function not working when looping through a list of dataframes循环遍历数据框列表时功能不起作用
【发布时间】:2022-01-15 18:46:32
【问题描述】:

我有一个数据框列表,我想遍历所有这些数据框并执行相同的操作。数据帧具有相同的格式。我使用了一个函数和一个循环,就像您在下面的代码中看到的那样,但似乎传递的唯一更改是列的重命名。我在这里遗漏了什么吗?

def changes(df):
    df = df[["A","B","C"]]
    df = df/1000000
    df["A"] = df["A"]*1000000
    df.rename(columns={'A': 'A1', 'B': 'B1','C': 'C1'}, inplace=True)
    df["A"] = df["A"].astype(int)
    df = df.transpose()
    return df

dfs = [df1,df2,df3]

for i in dfs:
    i = changes(i)

【问题讨论】:

  • 你为什么要这样做,这样做的目的是什么需要更多的澄清
  • @MdTausif 我在问题中提到我有很多不同的数据帧,我想在所有数据帧中执行相同的操作,例如重命名它们的列,只保留某些列,将它们乘以一个编号并转置它们。最后,我希望他们用相同名称的新数据框替换旧数据框。
  • 不不,问题是,您将值分配给 i,而您不想这样做。

标签: python pandas dataframe function loops


【解决方案1】:

问题是您将修改后的数据框命名为i,这是您的 for 循环中的迭代器,它没有存储在任何地方。您可以通过使用列表推导创建具有所需输出的新数据框列表来解决此问题,以避免 for 循环。例如:

dfs = [df1,df2,df3]
new_dfs = [changes(i) for i in dfs]

编辑:

您可以简单地重新分配它们:

df1,df2,df3 = [changes(i) for i in dfs]

【讨论】:

  • 谢谢你。实际上,更改是通过 new_dfs 传递的。但是,这并不能解决如果我在代码没有改变之后调用 df1 的问题
  • 那么只需更新原始位置即可。 dfs[i] = some_change(dfs[i]) 或类似的东西
  • 嗨,请检查我的编辑,或者也听从@Mahrkeenerh 的建议!
  • @CeliusStingher 谢谢,这正是我需要的!!
  • 请随意使用左侧的勾号接受答案。这会将问题标记为已回答并奖励我们一些分数。
【解决方案2】:

在你的循环中使用enumerate

# Setup
df1 = pd.DataFrame({'A': [10 , 20 , 30], 'B': [11, 21, 31], 'C': [12, 22, 32]})
df2 = pd.DataFrame({'A': [110 , 120 , 130], 'B': [111, 121, 131], 'C': [112, 122, 132]})
df3 = pd.DataFrame({'A': [210 , 220 , 230], 'B': [211, 221, 231], 'C': [212, 222, 232]})
dfs = [df1, df2, df3]

def changes(df):
    df = df[["A","B","C"]]
    df = df/1000000
    df["A"] = df["A"]*1000000
    df = df.rename(columns={'A': 'A1', 'B': 'B1','C': 'C1'})  # <- Don't use inplace
    df["A1"] = df["A1"].astype(int)  # <- A does not exist anymore
    df = df.transpose()
    return df
    
for i, df in enumerate(dfs):
    dfs[i] = changes(df)

输出:

>>> dfs
[            0          1          2
 A1  10.000000  20.000000  30.000000
 B1   0.000011   0.000021   0.000031
 C1   0.000012   0.000022   0.000032,
              0           1           2
 A1  110.000000  120.000000  130.000000
 B1    0.000111    0.000121    0.000131
 C1    0.000112    0.000122    0.000132,
              0           1           2
 A1  210.000000  220.000000  230.000000
 B1    0.000211    0.000221    0.000231
 C1    0.000212    0.000222    0.000232]

【讨论】:

  • 感谢您的回复。我认为我在描述问题时做得不好。问题是我希望在使用循环运行函数后以新形式拥有 df1, df2 ....,而使用您的解决方案它会更改 dfs 而不是 df1
【解决方案3】:

更好地应用 oops

class Changes:
    def __init__(self,df):
        self.df = df
    def transform(self):
        df = self.df[["A","B","C"]]
        df= self.df/1000000
        df = self.df["A"]*1000000
        self.df.rename(columns={'A': 'A1', 'B': 'B1','C': 'C1'},inplace=True}
        df["A"] = self.df["A"].astype(int)
        df = self.df.transpose()
        return df

obj = Changes(df)
df = obj.transform()

现在您可以遍历数据框列表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2017-06-08
    • 1970-01-01
    • 2021-08-31
    • 2021-02-08
    • 1970-01-01
    相关资源
    最近更新 更多