如何将空列添加到数据框?

时间:2013-05-01 21:46:47

标签: python pandas

将空列添加到pandas DataFrame对象的最简单方法是什么?我偶然发现的最好的就是

df['foo'] = df.apply(lambda _: '', axis=1)

是否有一种不那么不正常的方法?

13 个答案:

答案 0 :(得分:284)

如果我理解正确,分配应填写:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4
>>> df["C"] = ""
>>> df["D"] = np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

答案 1 :(得分:31)

要添加到DSM的答案并在this associated question上构建,我将该方法分为两种情况:

  • 添加单个列:只需为新列指定空值,例如df['C'] = np.nan

  • 添加多列:我建议使用.reindex(columns=[...]) method of pandas将新列添加到数据框的列索引中。这也适用于添加多个新行。

以下是添加多列的示例:

mydf = mydf.reindex( mydf.columns.tolist() + ['newcol1','newcol2'])  # version >= 0.20.0

mydf = mydf.reindex( columns = mydf.columns.tolist() + ['newcol1','newcol2'])  # version < 0.20.0

您也可以将新的(空)数据框连接到现有的数据框,但这对我来说并不像pythonic:)

答案 2 :(得分:27)

更简单的解决方案是:

header_list = ['a','b','c', 'd']

其中“header_list”是您要显示的标题列表。

列表中包含的任何未在数据框中找到的标题将添加下面的空白单元格。

所以,如果

Bundle b = new Bundle();
b.putParcelable("someuser",user);
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("SomeText", "sometext");
intent.putExtra("itemId", itemId);
intent.putExtra(b);
startActivity(intent);

然后将c和d添加为具有空白单元格的列

答案 3 :(得分:14)

v0.16.0开始,DF.assign()可用于将新列(单个/多个)分配给DF。这些列在DF的末尾按字母顺序插入。

与您希望直接对返回的数据帧执行一系列链接操作的情况下的简单赋值相比,这变得更有利。

考虑@DSM演示的相同DF样本:

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
df
Out[18]:
   A  B
0  1  2
1  2  3
2  3  4

df.assign(C="",D=np.nan)
Out[21]:
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

请注意,这将返回包含所有先前列以及新创建的列的副本。为了相应地修改原始DF,请使用它:df = df.assign(...),因为它目前不支持inplace操作。

答案 4 :(得分:4)

我喜欢:

df['new'] = pd.Series()

这可以确保具有零行的df保持零行。

答案 5 :(得分:3)

@ emunsing的answer对于添加多个列非常酷,但我无法让它在python 2.7中为我工作。相反,我发现这有效:

mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])

答案 6 :(得分:3)

如果要从列表中添加列名

df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in range(len(a)):
    df[a[i]]=np.nan

答案 7 :(得分:1)

以下代码解决了以下问题:“如何在现有数据框中添加n个空列”。为了将类似问题的解决方案集中在一个地方,我在这里添加它。

方法1(使用1-64的列名称创建64个其他列)

m = list(range(1,65,1)) 
dd=pd.DataFrame(columns=m)
df.join(dd).replace(np.nan,'') #df is the dataframe that already exists

方法2(使用1-64的列名称创建64个其他列)

df.reindex(df.columns.tolist() + list(range(1,65,1)), axis=1).replace(np.nan,'')

答案 8 :(得分:1)

一个人可以使用df.insert(index_to_insert_at, column_header, init_value)在特定索引处插入新列。

cost_tbl.insert(1, "col_name", "") 

以上语句将在第一列之后插入一个空列。

答案 9 :(得分:0)

您可以

import os
import random
from faker import Faker

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myfirst.settings')
import django
django.setup()

from first_app.models import Topic, Webpage, AccessRecord

#...

答案 10 :(得分:0)

对不起,我在开始时并没有很好地解释我的答案。还有另一种将新列添加到现有数据框的方法。 第一步,创建一个新的空数据框(包含数据框中的所有列,以及要添加的新列或少数列),称为df_temp 第二步,将df_temp和您的数据框结合起来。

df_temp = pd.DataFrame(columns=(df_null.columns.tolist() + ['empty']))
df = pd.concat([df_temp, df])

这可能是最好的解决方案,但这是思考此问题的另一种方式。

我使用此方法的原因是因为我一直都收到此警告:

: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df["empty1"], df["empty2"] = [np.nan, ""]

很棒,我找到了禁用警告的方法

pd.options.mode.chained_assignment = None 

答案 11 :(得分:0)

我寻找这样一个解决方案的原因只是在使用 pd.concat 函数按列连接的多个 DF 之间添加空格,然后使用 xlsxwriter 写入 excel。

df[' ']=df.apply(lambda _: '', axis=1)
df_2 = pd.concat([df,df1],axis=1)                #worked but only once. 
# Note: df & df1 have the same rows which is my index. 
#
df_2[' ']=df_2.apply(lambda _: '', axis=1)       #didn't work this time !!?     
df_4 = pd.concat([df_2,df_3],axis=1)

然后我用

替换了第二个lambda调用
df_2['']=''                                 #which appears to add a blank column
df_4 = pd.concat([df_2,df_3],axis=1)

我测试它的输出是使用 xlsxwriter 来表现出色。 尽管没有 xlsx 格式,但 Jupyter 空白列看起来与 excel 中的相同。 不知道为什么第二个 Lambda 调用不起作用。

答案 12 :(得分:0)

这也适用于多列:

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4

df1 = pd.DataFrame(columns=['C','D','E'])
df = df.join(df1, how="outer")

>>>df
    A   B   C   D   E
0   1   2   NaN NaN NaN
1   2   3   NaN NaN NaN
2   3   4   NaN NaN NaN

然后对列做任何你想做的事情 pd.Series.fillna(),pd.Series.map()