【问题标题】:Iterating over dataframes and adding items from a list迭代数据框并从列表中添加项目
【发布时间】:2021-12-09 06:54:52
【问题描述】:

python 数据分析的新手,还是个菜鸟。

我有一个熊猫数据框列表 (+100),其中的变量保存在列表中。

然后我将变量以字符串格式保存在另一个列表中,以便在绘图时作为标识符添加到数据帧中。

我已经定义了一个函数来为以后的特征工程准备表格。

我想遍历每个数据框并将对应的字符串添加到名为“Strings”的列中

df = [df1, df2, df3]
strings = ['df1', 'df2', 'df3']


def mindex(df):
# remove time index and insert Strings column 
    df.reset_index(inplace=True)
    df.insert(1, "Strings", "")

    # iterate through each table adding the string values 
    for item in enumerate(df):
        for item2 in strings:
            df['Strings'] = item2


# the loop to cycle through all the dateframes using the function above
for i in df:
    mindex(i)

当我使用上面的函数时,它只会将最后一个值填充到所有数据帧中。我想指出,所有数据帧都在同一日期范围内,因为我试图用它作为一种停止迭代而没有胜利的方法。

谁能指出我正确的方向!到目前为止,Google 还不是我的朋友

【问题讨论】:

  • 我不完全理解目标。您是否尝试向每个 df 添加具有相应名称 df 的列?即 df1 应该有一个名为“Strings”的列,它将在所有行中采用值“df1”?
  • 是的。 df1 将有一列,其中所有行都显示为 'df1'、df2 = 'df2' 等

标签: python pandas list dataframe


【解决方案1】:
df = [df1, df2, df3]
strings = ['df1', 'df2', 'df3']

for s, d in zip(strings, df):
   d['Strings'] = s

【讨论】:

    【解决方案2】:

    df['Strings'] = item2 行中,您将变量 item2 分配到整个列 df["Strings"]。 所以第一次迭代分配“df1”,第二次分配“df2”并以“df3”结束,这就是你最终看到的。

    如果您想在列 Strings 中完全填充 df1 的“df1”、df2 的“df2”等,您必须:

    def mindex(dfs: list, strings: list) -> list:
        final_dfs = []
        for single_df, df_name in zip(dfs, strings):
            single_df = single_df.copy()
            single_df.reset_index(inplace=True)
            single_df.insert(1, "Strings", "")
    
            single_df['Strings'] = df_name
            final_dfs.append(single_df)
        return final_dfs
    
    dfs = [df1, df2, df3]
    strings = ['df1', 'df2', 'df3']
    
    result = mindex(dfs, strings)
    

    几个要点:

    1. 如果您定义 dfs 列表,请将其命名为 dfs(复数),而不是 df。
    dfs = [df1, df2, df3]
    
    1. 如果您遍历 pandas DataFrame,请使用 df.iterrows()。它将生成索引和行,因此您无需应用 enumerate
    for idx, row in df.iterrows():
        ....
    
    1. 如果您在 for 循环中使用了不会使用的变量,例如您的示例 item,请改用下划线。无用变量的好习惯:
    for _ in enumerate(df):
        for item2 in strings:
            df['Strings'] = item2
    

    【讨论】:

    • 不了解您所做的一些事情(要研究的新概念),但它确实有效,并且可以让我继续我的项目。如果我想将结果保存到现有的数据框架中而不是将它们合并到一个新的框架中,您有什么建议吗?
    • 我不知道你想达到什么目的,但如果你最终想得到带有修改过的 dfs 的输入列表,你可以覆盖变量:dfs = mindex(dfs, strings)
    猜你喜欢
    • 2021-10-23
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2019-06-09
    • 1970-01-01
    • 2020-07-30
    相关资源
    最近更新 更多