将列中的所有值复制到pandas数据帧中的新列

Jus*_*nan 34 python pandas

这是一个非常基本的问题,我似乎无法找到答案.

我有一个这样的数据帧,称为df:

  A     B     C
 a.1   b.1   c.1
 a.2   b.2   c.2
 a.3   b.3   c.3
Run Code Online (Sandbox Code Playgroud)

然后我从df中提取所有行,其中列'B'的值为'b.2'.我将这些结果分配给df_2.

df_2 = df[df['B'] == 'b.2']
Run Code Online (Sandbox Code Playgroud)

df_2成为:

  A     B     C
 a.2   b.2   c.2
Run Code Online (Sandbox Code Playgroud)

然后,我将列'B'中的所有值复制到名为'D'的新列中.导致df_2成为:

  A     B     C     D
 a.2   b.2   c.2   b.2
Run Code Online (Sandbox Code Playgroud)

当我执行这样的任务时:

df_2['D'] = df_2['B']
Run Code Online (Sandbox Code Playgroud)

我收到以下警告:

尝试在DataFrame的切片副本上设置值.尝试使用.loc [row_indexer,col_indexer] = value

请参阅文档中的警告:http: //pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy


在创建像这样的df_2时我也尝试过使用.loc:

df_2 = df.loc[df['B'] == 'b.2']
Run Code Online (Sandbox Code Playgroud)

但是,我仍然收到警告.

任何帮助是极大的赞赏.

Ana*_*mar 58

您可以简单地将其分配B给新列,如 -

df['D'] = df['B']
Run Code Online (Sandbox Code Playgroud)

示例/演示 -

In [1]: import pandas as pd

In [2]: df = pd.DataFrame([['a.1','b.1','c.1'],['a.2','b.2','c.2'],['a.3','b.3','c.3']],columns=['A','B','C'])

In [3]: df
Out[3]:
     A    B    C
0  a.1  b.1  c.1
1  a.2  b.2  c.2
2  a.3  b.3  c.3

In [4]: df['D'] = df['B']                  #<---What you want.

In [5]: df
Out[5]:
     A    B    C    D
0  a.1  b.1  c.1  b.1
1  a.2  b.2  c.2  b.2
2  a.3  b.3  c.3  b.3

In [6]: df.loc[0,'D'] = 'd.1'

In [7]: df
Out[7]:
     A    B    C    D
0  a.1  b.1  c.1  d.1
1  a.2  b.2  c.2  b.2
2  a.3  b.3  c.3  b.3
Run Code Online (Sandbox Code Playgroud)

  • @AnandSKumar在应用您的解决方案时会收到警告:`正在尝试在DataFrame的切片副本上设置值. (9认同)
  • 谢谢!我得到:尝试在DataFrame的切片副本上设置一个值.尝试使用.loc [row_indexer,col_indexer] = value,请参阅文档中的警告:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy df [' D'] = df ['B']迭代每一行拉出值并将其分配给新列会更好吗?或者这不是问题? (7认同)
  • 我尝试使用 `df = df.copy()` 然后使用 `df['D'] = df['B']` 我没有收到任何警告 (3认同)

Ale*_*lex 17

问题出现在抛出警告的那一行之前.当您创建df_2时,您正在创建数据帧切片的副本.相反,当您创建df_2时,请使用.copy(),稍后您将不会收到该警告.

df_2 = df[df['B'] == 'b.2'].copy()
Run Code Online (Sandbox Code Playgroud)

  • 与 .copy() 的区别在于它返回一个新对象而不是原始对象的视图。因此,如果您更改新对象,则不会更改原始对象。 (5认同)
  • 这解决了它!谢谢 (2认同)

Myk*_*tko 7

您可以使用该方法assign。它返回一个新的 DataFrame,以便您可以将其与其他方法一起使用在链中。

df.assign(D=df.B)
Run Code Online (Sandbox Code Playgroud)

输出:

     A    B    C    D
0  a.1  b.1  c.1  b.1
1  a.2  b.2  c.2  b.2
2  a.3  b.3  c.3  b.3
Run Code Online (Sandbox Code Playgroud)


小智 5

我认为正确的访问方法是使用索引:

df_2.loc[:,'D'] = df_2['B']
Run Code Online (Sandbox Code Playgroud)

  • 它将引发“SettingWithCopyWarning” (10认同)