Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以同时向数据帧添加多个列?_Python_Pandas - Fatal编程技术网

Python 是否可以同时向数据帧添加多个列?

Python 是否可以同时向数据帧添加多个列?,python,pandas,Python,Pandas,如果我想创建一个包含多个列的新DataFrame,我可以一次添加所有列——例如,如下所示: data = {'col_1': [0, 1, 2, 3], 'col_2': [4, 5, 6, 7]} df = pd.DataFrame(data) 但是现在假设再往前走,我想向这个数据帧添加一组额外的列。是否有一种方法可以同时添加它们,如 additional_data = {'col_3': [8, 9, 10, 11], 'col_4':

如果我想创建一个包含多个列的新DataFrame,我可以一次添加所有列——例如,如下所示:

data = {'col_1': [0, 1, 2, 3],
        'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(data)
但是现在假设再往前走,我想向这个数据帧添加一组额外的列。是否有一种方法可以同时添加它们,如

additional_data = {'col_3': [8, 9, 10, 11],
                   'col_4': [12, 13, 14, 15]}
#Below is a made-up function of the kind I desire.
df.add_data(additional_data)
我知道我可以这样做:

for key, value in additional_data.iteritems():
    df[key] = value
或者这个:

df2 = pd.DataFrame(additional_data, index=df.index)
df = pd.merge(df, df2, on=df.index)

我只是希望有更干净的东西。如果我坚持使用这两个选项,您更喜欢哪一个?

您需要的是
join
功能:

df1.join(df2, how='outer')
#or
df1.join(df2) # this works also
例如:

data = {'col_1': [0, 1, 2, 3],
    'col_2': [4, 5, 6, 7]}
df1 = pd.DataFrame(data)

additional_data = {'col_3': [8, 9, 10, 11],
               'col_4': [12, 13, 14, 15]}
df2 = pd.DataFrame(additional_data)

df1.join(df2, how='outer')
输出:

   col_1  col_2  col_3  col_4
0      0      4      8     12
1      1      5      9     13
2      2      6     10     14
3      3      7     11     15

如果您不想从
其他\u数据创建新的数据帧,可以使用以下方法:

>>> additional_data = [[8, 9, 10, 11], [12, 13, 14, 15]]
>>> df['col3'], df['col4'] = additional_data
>>> df
   col_1  col_2  col3  col4
0      0      4     8    12
1      1      5     9    13
2      2      6    10    14
3      3      7    11    15
也可以这样做,但这将是新的DataFrame,而不是现有DataFrame的就地修改:

>>> additional_header = ['col_3', 'col_4']
>>> additional_data = [[8, 9, 10, 11], [12, 13, 14, 15]]
>>> df = pd.DataFrame(data=np.concatenate((df.values.T, additional_data)).T, columns=np.concatenate((df.columns, additional_header)))
>>> df
   col_1  col_2  col_3  col_4
0      0      4      8     12
1      1      5      9     13
2      2      6     10     14
3      3      7     11     15

您所需要做的就是使用附加数据框中的数据创建新列

data =            {'col_1': [0, 1, 2, 3],
                   'col_2': [4, 5, 6, 7]}
additional_data = {'col_3': [8, 9, 10, 11],
                   'col_4': [12, 13, 14, 15]}
df = pd.DataFrame(data)
df2 = pd.DataFrame(additional_data)

df[df2.columns] = df2
df现在看起来像:

   col_1  col_2  col_3  col_4
0      0      4      8     12
1      1      5      9     13
2      2      6     10     14
3      3      7     11     15
   col_1  col_2  col_3
0      0      8     12
1      1      9     13
2      2     10     14
3      3    NaN    NaN
原始数据帧中的索引将被使用,就像执行了就地左连接一样。原始数据帧中的数据列在附加数据帧中具有匹配名称,这些数据将被覆盖。 例如:

data =            {'col_1': [0, 1, 2, 3],
                   'col_2': [4, 5, 6, 7]}
additional_data = {'col_2': [8, 9, 10, 11],
                   'col_3': [12, 13, 14, 15]}
df = pd.DataFrame(data)
df2 = pd.DataFrame(additional_data, index=[0,1,2,4])

df[df2.columns] = df2
df现在看起来像:

   col_1  col_2  col_3  col_4
0      0      4      8     12
1      1      5      9     13
2      2      6     10     14
3      3      7     11     15
   col_1  col_2  col_3
0      0      8     12
1      1      9     13
2      2     10     14
3      3    NaN    NaN
Pandas自
0.16.0
以来一直使用此方法。您可以在数据帧上使用它,例如

In [1506]: df1.assign(**df2)
Out[1506]:
   col_1  col_2  col_3  col_4
0      0      4      8     12
1      1      5      9     13
2      2      6     10     14
3      3      7     11     15
或者,你可以直接使用字典,比如

In [1507]: df1.assign(**additional_data)
Out[1507]:
   col_1  col_2  col_3  col_4
0      0      4      8     12
1      1      5      9     13
2      2      6     10     14
3      3      7     11     15

啊,谢谢!但是,如果不先创建一个新的数据帧,
df2
(除了
for
循环选项之外),我就无法向
df1
添加
附加数据,这是正确的吗?最好有
df1。添加数据(附加数据)
。我想知道韦斯是否会因为接受了熊猫的这种服从而感到沮丧。啊,好主意。但是,当新列的数量和名称可以是可变的时,这个选项就不太好了。@dbliss确切地说,我在考虑是否可以在general@dbliss添加了另一种可能的解决方案。不能说我很喜欢它。我认为for循环可能是dict中最好/最有效的方式,尽管join感觉“更干净”。@AndyHayden可能会创建新的扩展方法。不能肯定,但如果列数很大,循环的效率应该比数组的一次性扩展低,否则我错了?@RomanPekar如果它已经是python对象(dict),我认为它不会更快。嗯,我必须测试这个问题似乎很相似: