将列中的所有值复制到熊猫数据框中的新列

Posted

技术标签:

【中文标题】将列中的所有值复制到熊猫数据框中的新列【英文标题】:Copy all values in a column to a new column in a pandas dataframe 【发布时间】:2015-12-17 00:14:59 【问题描述】:

这是一个非常基本的问题,我似乎找不到答案。

我有一个像这样的数据框,叫做 df:

  A     B     C
 a.1   b.1   c.1
 a.2   b.2   c.2
 a.3   b.3   c.3

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

df_2 = df[df['B'] == 'b.2']

df_2 变为:

  A     B     C
 a.2   b.2   c.2

然后,我将“B”列中的所有值复制到名为“D”的新列中。导致 df_2 变为:

  A     B     C     D
 a.2   b.2   c.2   b.2

当我执行这样的任务时:

df_2['D'] = df_2['B']

我收到以下警告:

试图在 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']

但是,我仍然收到警告。

非常感谢任何帮助。

【问题讨论】:

a.1 是什么意思?是字符串吗? 【参考方案1】:

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

df['D'] = df['B']

示例/演示 -

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

【讨论】:

你使用了`df['D'] = df['B'] 对吗?你不应该得到那个,你做了别的吗? 谢谢!我得到:试图在 DataFrame 中的切片副本上设置一个值。尝试改用 .loc[row_indexer,col_indexer] = value 查看文档中的警告:pandas.pydata.org/pandas-docs/stable/… df['D'] = df['B']将其分配给新列?或者这不是问题? 就像我说的,你用过df['D'] = df['B'] 吗?如果没有,你还用了什么? @AnandSKumar 我们在应用您的解决方案时收到警告:A value is trying to be set on a copy of a slice from a DataFrame. 我尝试使用df = df.copy() 然后df['D'] = df['B'] 我没有收到任何警告【参考方案2】:

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

df_2 = df[df['B'] == 'b.2'].copy()

【讨论】:

解决了!谢谢 .copy() 到底有什么不同? 与 .copy() 的不同之处在于它返回一个新对象而不是原始对象的视图。因此,如果您更改新对象,则不会更改原始对象。【参考方案3】:

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

df_2.loc[:,'D'] = df_2['B']

【讨论】:

它会引发“SettingWithCopyWarning” @HarperKoo 你用的是什么版本的熊猫?【参考方案4】:

怎么样:

df['D'] = df['B'].values

【讨论】:

【参考方案5】:

这是您的数据框:

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

您的答案在 Pandas 文档中“索引和选择数据”部分的“Setting with enlargement”段落中。

上面写着:

DataFrame 可以通过 .loc 在任一轴上放大。

所以你需要做的只是以下两个之一:

df.loc[:, 'D'] = df.loc[:, 'B']
df.loc[:, 'D'] = df['B']

【讨论】:

【参考方案6】:

您可以使用方法assign。它返回一个新的 DataFrame,因此您可以将它与其他方法一起使用。

df.assign(D=df.B)

输出:

     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

【讨论】:

【参考方案7】:

这个问题是不久前提出的,但我的回答可以帮助其他人。

我也遇到过类似的情况。当你将一个数据框切片成df_2时,你需要重置索引,

df_2 = df_2.reset_index(drop = True)  

现在您可以在没有警告的情况下运行命令

df_2['D'] = df_2['B']

【讨论】:

【参考方案8】:

跟进这些解决方案,这里有一些有用的代码说明:

#
# Copying columns in pandas without slice warning
#
import numpy as np
df = pd.DataFrame(np.random.randn(10, 3), columns=list('ABC'))

#
# copies column B into new column D
df.loc[:,'D'] = df['B']
print df

#
# creates new column 'E' with values -99
# 
# But copy command replaces those where 'B'>0 while others become NaN (not copied)
df['E'] = -99
print df
df['E'] = df[df['B']>0]['B'].copy()
print df

#
# creates new column 'F' with values -99
# 
# Copy command only overwrites values which meet criteria 'B'>0
df['F']=-99
df.loc[df['B']>0,'F'] = df[df['B']>0]['B'].copy()
print df

【讨论】:

以上是关于将列中的所有值复制到熊猫数据框中的新列的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何在比较其他列时将列值填充到另一个数据框中的新列?

将列中的唯一值分隔到同一数据框中的单独列中

如何将列中的所有数据移动到单个列(不合并),然后拆分为R中的新列?

如何在熊猫数据框中的所有列中搜索模式,并在找到时将其复制到另一列

Pandas:使用 apply 将特定列中的行值复制到新列中

将来自一个数据框的值合并到 Pandas 中的新列中[重复]