如何遍历数据框,将新字段添加到系列,然后将该系列附加到 csv?

Posted

技术标签:

【中文标题】如何遍历数据框,将新字段添加到系列,然后将该系列附加到 csv?【英文标题】:How to loop over a dataframe, add new fields to a series, then append that series to a csv? 【发布时间】:2019-11-06 03:33:19 【问题描述】:

给定一个 Pandas 数据框,例如:

Name   Age
John   20
Mary   65
Bob    55

我希望遍历行,确定每个人是否是老年人(年龄> = 60),创建一个带有额外列的新条目,然后将其附加到一个 csv 文件中,这样它(csv 文件) 内容如下:

Name   Age  Senior
John   20   False
Mary   65   True
Bob    55   False

除了将数据保存到 csv 之外,我还可以通过将循环当前正在迭代的系列转到字典然后添加新键来完成其余的工作。

for idx, e in records.iterrows():

        entry = e.to_dict()
        entry["senior"] = (entry["age"]<60)

仅将 dict 转换为系列到数据框并不能正确地将其写入 csv 文件。是否有熊猫或非熊猫的方式来完成这项工作?

重要编辑:上面是一个简化的例子,我正在处理数百行,我要添加的数据是一个长字符串将在运行时创建 strong>,所以循环是强制性的。此外,将其添加到原始数据帧不是一个选项,因为我很确定我会在某个时候用完程序内存(因此我无法将数据添加到原始数据帧,也无法创建包含所有信息的新数据帧)。 我不想将数据添加到原始数据框中,只想添加到“行”的副本,然后将其附加到 csv。

给出这个例子是为了为我的问题提供一些背景,但主要关注点应该放在问题上,而不是例子上。

【问题讨论】:

看起来很简单。在每次迭代中,使用要写入文件的行构建一个字符串,然后将该字符串写入文件。 【参考方案1】:

使用 np.where

import numpy as np
df1 = df.copy()
df1['Senior'] = np.where(df1['Age']>60,True,False)

【讨论】:

@MohamadMoustafa 您可以简单地将任何字符串添加到 True 和 False @MohamadMoustafa 因为我们正在将数据复制到其他数据框原始数据框不会受到影响 df1.to_csv("file_name.csv") 然后删除 df1【参考方案2】:

此处的循环不是必需的,仅通过与标量比较来分配新列,并避免在原始 DataFrame 中创建列,使用 DataFrame.assign - 它返回新的 DataFrame 和新列,而原始列不会更改:

df1 = df.assign(senior = df["age"]>=60)

编辑:

如果真的需要循环(not recommended):

for idx, e in df.iterrows():
    df.loc[idx, "senior"] = e["Age"]>=60

print (df)
   Name  Age  senior
0  John   20   False
1  Mary   65    True
2   Bob   55   False

【讨论】:

这会改变原来的数据框,我不想那样。 我的编辑还提到我将添加的实际数据是一堆(大)字符串,这就是为什么我不希望一次创建整个数据框而是逐行处理它的原因。此外,我存储的字符串是在运行时创建的,所以我需要遍历这些行。我只想知道如何将我已经在我的代码(条目)中拥有的字典存储到 csv 中,这样它看起来就像我在我的代码中拥有的那样。 @MohamadMoustafa - 我不明白。您是否需要为现有的csv 创建一个或多个新列? 从 csv 我得到一个数据框,我遍历该数据框并(根据每一行中的信息)生成一个字符串,我想在新列下添加该字符串。但由于字符串可能很大,我不想将它添加到原始数据框中。我将系列(被循环的行)转换为字典以轻松添加新数据(通过添加新键)。我现在想要的是获取该字典,并以某种方式将其附加到另一个 csv 文件中,以便它看起来与第一个 csv 相同,但有一个额外的列(或者知道是否有更好的方法来做我想做的事情不使用字典)。【参考方案3】:

你也可以使用ge:

df2 = df.copy()
df2['senior'] = df2['Age'].ge(60)

现在:

print(df2)

输出:

   Name  Age senior
0  John   20  False
1  Mary   65   True
2   Bob   55  False

【讨论】:

【参考方案4】:

在这里找到我需要的答案:Convert a dictionary to a pandas dataframe

代码:

first_entry=True
for idx, e in records.iterrows():

        entry = e.to_dict()
        entry["senior"] = (entry["age"]<60)
        df_entry = pd.DataFrame([entry], columns=entry.keys())

        df_entry.to_csv(output_path, sep=',', index=False, columns=header,header=first_entry,mode='a') 
        #output_path is a variable with path to csv, header is a variable with list of new column names
        first_entry=False

希望有更好的方法,但这个方法很好。

【讨论】:

以上是关于如何遍历数据框,将新字段添加到系列,然后将该系列附加到 csv?的主要内容,如果未能解决你的问题,请参考以下文章

迭代地添加计算列,然后将新数据添加到 Pandas 数据框(python 3.7.1)

如何将新列添加到按 groupby 分组的分层数据框中

如何将新列添加到 Android SQLite 数据库?

将系列连接到具有列名的数据框中

SqlAlchemy 将新字段添加到类并在表中创建相应的列

Python - Pandas - 导入 Excel 文件,遍历每一行,添加新值,并添加到数据框