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

时间:2015-09-20 04:38:05

标签: python pandas

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

我有一个这样的数据框,名为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']

但是,我仍然收到警告。

非常感谢任何帮助。

7 个答案:

答案 0 :(得分:49)

您只需将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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

下面是这些解决方案,下面是一些有用的代码,说明了:

#
# 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

答案 3 :(得分:0)

怎么样:

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

答案 4 :(得分:0)

这是您的数据框:

def square_root(number):
    old_guess = 1
    guess = 2
    guesssquared = 0
    while round(guesssquared, 10) != round(number, 10):
        old_guess = guess
        guess = ((number / guess) + guess ) / 2
        print(guess)
        guesssquared = guess * guess
    return guess

solution = square_root(7) #finds square root of 7
print(solution)

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

它说:

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

因此,您只需要做以下两个操作之一即可:

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']})

答案 5 :(得分:0)

您可以使用 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

答案 6 :(得分:0)

这个问题是前一段时间提出的,但我的回答可以帮助其他人。

我也遇到过类似的情况。当您将数据帧切片为 df_2 时,您需要重置索引,

df_2 = df_2.reset_index(drop = True)  

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

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