【问题标题】:How to add new column data by individual rows in Pandas DataFrame如何在 Pandas DataFrame 中按单独的行添加新的列数据
【发布时间】:2020-11-08 03:29:56
【问题描述】:

我有一个数据框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

编辑 我实际上在 stackoverflow 上问了一个问题,我无法得到答案。这就是为什么我试图浓缩这个问题并以这种方式提出。如果可能的话,你们都可以检查原始问题here

【问题讨论】:

  • 为什么要一次在行上添加数据?这违背了 pandas 的初衷。
  • 实际上这是我在stackoverflow上实际询问过的问题的一种浓缩形式,但没有得到答案。所以我想以更简单的方式呈现同样的内容。您可以查看我的原始问题并在那里回答 @user3483203 stackoverflow.com/questions/62958702/…

标签: python pandas loops dataframe nan


【解决方案1】:

使用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

【讨论】:

    【解决方案2】:

    免责声明 - 您应该使用此代码。这是错误的方式。但是 - 鉴于您想逐行执行,这里有一个解决方案:

    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 方面要好得多。

    【讨论】:

    • 以矢量化的方式进行,而不是逐行。我会在我的答案中添加正确的方法。
    • @baxx - 确实如此。和 AFAIK,加号运算符调用系列的 add 方法。
    • 请检查问题编辑。
    【解决方案3】:

    不清楚您为什么要尝试使用低效的方法一次添加一行,因此我建议不要使用此代码,而是依赖矢量化解决方案。

    但是,如果你真的出于某种原因想要这样做,你应该像这样修改你的循环

    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
    

    【讨论】:

    • 请检查我的问题编辑。它解释了我写这段代码的原因。
    【解决方案4】:

    也许:

    for i in range(len(df)):
        df["val"].iloc[i] = df.val.iloc[i] + 10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      相关资源
      最近更新 更多