如何在 Pandas DataFrame 中按单行添加新列数据
How to add new column data by individual rows in Pandas DataFrame
我有一个数据框 df
。我想添加 2 个新列 0
和 1
并将数据一次一行地添加到这些列,而不是一次添加完整的列。通过对 df
中的所有行使用 pd.Series
,我在除最后一行以外的新列数据中得到 NaN
值。给我一个解决这个问题的方法。
我需要一次一行地添加数据。请提供相应的解决方案。
df
val
1
2
3
代码
for j in range(len(df)):
for i in range(2):
cal = df.val.iloc[j] + 10
df[i] = pd.Series(cal, index=df.index[[j]])
输出
val | 0 | 1
1 | NaN | NaN
2 | NaN | NaN
3 | 13.0 | 13.0
预期输出
val | 0 | 1
1 | 11.0 | 11.0
2 | 12.0 | 12.0
3 | 13.0 | 13.0
编辑
我实际上在 Whosebug 上问了一个问题,我无法得到答案。这就是为什么我试图浓缩这个问题并以这种方式呈现它。可能的话大家可以看看原题
使用apply
函数
In [29]: df
Out[29]:
val
0 1
1 2
2 3
In [13]: df[0] = df["val"].apply(lambda x: x + 10)
In [14]: df[1] = df["val"].apply(lambda x: x + 10)
In [15]: df
Out[15]:
val 0 1
0 1 11 11
1 2 12 12
2 3 13 13
或使用iterrows
In [21]: temp = []
In [22]: for inex,row in df.iterrows():
...: temp.append(row["val"] + 10)
...:
In [23]: temp
Out[23]: [11, 12, 13]
In [24]: df[0] = temp
In [25]: df[1] = temp
In [26]: df
Out[26]:
val 0 1
0 1 11 11
1 2 12 12
2 3 13 13
免责声明 - 您应该不使用此代码。这是错误的方式。但是 - 如果您想逐行进行,这里有一个解决方案:
df = pd.DataFrame({"val": [1,2, 3]})
for i in df.index:
val = df.loc[i, "val"]
for j in [0,1]:
df.loc[i, j] = val + 10
print(df)
==>
val 0 1
0 1 11.0 11.0
1 2 12.0 12.0
2 3 13.0 13.0
正确的方法是:
df = pd.DataFrame({"val": [1,2, 3]})
df[0] = df.val + 10
df[1] = df.val + 10
基本相同的结果,pandas。
不清楚您为什么尝试使用低效的方法一次添加一行,因此我建议不要使用此代码,而应依赖矢量化解决方案。
但是,如果你真的出于某种原因想要这样做,你应该像这样修改你的周期
for j in range(len(df)):
for i in range(2):
cal = df.val.iloc[j] + 10
df.loc[j, i] = cal
# val 0 1
# 0 1 11.0 11.0
# 1 2 12.0 12.0
# 2 3 13.0 13.0
也许:
for i in range(len(df)):
df["val"].iloc[i] = df.val.iloc[i] + 10
我有一个数据框 df
。我想添加 2 个新列 0
和 1
并将数据一次一行地添加到这些列,而不是一次添加完整的列。通过对 df
中的所有行使用 pd.Series
,我在除最后一行以外的新列数据中得到 NaN
值。给我一个解决这个问题的方法。
我需要一次一行地添加数据。请提供相应的解决方案。
df
val
1
2
3
代码
for j in range(len(df)):
for i in range(2):
cal = df.val.iloc[j] + 10
df[i] = pd.Series(cal, index=df.index[[j]])
输出
val | 0 | 1
1 | NaN | NaN
2 | NaN | NaN
3 | 13.0 | 13.0
预期输出
val | 0 | 1
1 | 11.0 | 11.0
2 | 12.0 | 12.0
3 | 13.0 | 13.0
编辑
我实际上在 Whosebug 上问了一个问题,我无法得到答案。这就是为什么我试图浓缩这个问题并以这种方式呈现它。可能的话大家可以看看原题
使用apply
函数
In [29]: df
Out[29]:
val
0 1
1 2
2 3
In [13]: df[0] = df["val"].apply(lambda x: x + 10)
In [14]: df[1] = df["val"].apply(lambda x: x + 10)
In [15]: df
Out[15]:
val 0 1
0 1 11 11
1 2 12 12
2 3 13 13
或使用iterrows
In [21]: temp = []
In [22]: for inex,row in df.iterrows():
...: temp.append(row["val"] + 10)
...:
In [23]: temp
Out[23]: [11, 12, 13]
In [24]: df[0] = temp
In [25]: df[1] = temp
In [26]: df
Out[26]:
val 0 1
0 1 11 11
1 2 12 12
2 3 13 13
免责声明 - 您应该不使用此代码。这是错误的方式。但是 - 如果您想逐行进行,这里有一个解决方案:
df = pd.DataFrame({"val": [1,2, 3]})
for i in df.index:
val = df.loc[i, "val"]
for j in [0,1]:
df.loc[i, j] = val + 10
print(df)
==>
val 0 1
0 1 11.0 11.0
1 2 12.0 12.0
2 3 13.0 13.0
正确的方法是:
df = pd.DataFrame({"val": [1,2, 3]})
df[0] = df.val + 10
df[1] = df.val + 10
基本相同的结果,pandas。
不清楚您为什么尝试使用低效的方法一次添加一行,因此我建议不要使用此代码,而应依赖矢量化解决方案。
但是,如果你真的出于某种原因想要这样做,你应该像这样修改你的周期
for j in range(len(df)):
for i in range(2):
cal = df.val.iloc[j] + 10
df.loc[j, i] = cal
# val 0 1
# 0 1 11.0 11.0
# 1 2 12.0 12.0
# 2 3 13.0 13.0
也许:
for i in range(len(df)):
df["val"].iloc[i] = df.val.iloc[i] + 10