给出一个熊猫数据框,例如:
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转换为series到dataframe并没有将其正确写入csv文件。有熊猫或非熊猫的方式可以完成这项工作吗?
重要编辑::上面是一个简化的示例,我正在处理数百行,并且我要添加的数据是一个长字符串,将在运行时创建 strong>,因此必须执行循环。另外,将其添加到原始数据帧不是一个选项,因为我敢肯定某个时刻我会耗尽程序内存(因此我无法将数据添加到原始数据帧,也无法创建包含所有信息的新数据帧)。 我不想将数据添加到原始数据框中,而仅添加到“行”的副本中,然后将其添加到csv中。
给出示例是为了为我的问题提供一些背景信息,但主要重点应该放在问题上,而不是示例上。
答案 0 :(得分: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
答案 1 :(得分:1)
使用np.where
import numpy as np
df1 = df.copy()
df1['Senior'] = np.where(df1['Age']>60,True,False)
答案 2 :(得分:1)
您还可以使用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
答案 3 :(得分:0)
在这里找到了我需要的答案: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
希望有一种更好的方法,但这可以正常工作。