如何在 Pandas DataFrame 中按单行添加新列数据

How to add new column data by individual rows in Pandas DataFrame

我有一个数据框 df。我想添加 2 个新列 01 并将数据一次一行地添加到这些列,而不是一次添加完整的列。通过对 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