向Pandas DataFrame追加行会添加0列

时间:2014-04-07 15:46:28

标签: python pandas append dataframe

我正在创建一个Pandas DataFrame来存储数据。不幸的是,我无法知道我将提前获得的数据行数。所以我的方法如下。

首先,我声明一个空的DataFrame。

df = DataFrame(columns=['col1', 'col2'])

然后,我追加了一行缺失值。

df = df.append([None] * 2, ignore_index=True)

最后,我可以一次将值插入此DataFrame中。 (为什么我必须一次完成一个单元格是一个很长的故事。)

df['col1'][0] = 3.28

这种方法非常合适,只是append语句在我的DataFrame中插入了一个额外的列。在流程结束时,我在输入df时看到的输出看起来像这样(包含100行数据)。

<class 'pandas.core.frame.DataFrame'>
Data columns (total 2 columns):
0            0  non-null values
col1         100  non-null values
col2         100  non-null values

df.head()看起来像这样。

      0   col1   col2
0  None   3.28      1
1  None      1      0
2  None      1      0
3  None      1      0
4  None      1      1

有关导致此0列出现在我的DataFrame中的原因的任何想法吗?

2 个答案:

答案 0 :(得分:4)

追加正在尝试将列附加到您的数据框。它试图追加的列没有命名,并且其中有两个None / Nan元素,pandas将其命名(默认情况下)为名为0的列。

为了成功完成此操作,进入数据框附加的列名必须与当前数据框列名一致,否则将创建新列(默认情况下)

#you need to explicitly name the columns of the incoming parameter in the append statement
df = DataFrame(columns=['col1', 'col2'])
print df.append(Series([None]*2, index=['col1','col2']), ignore_index=True)


#as an aside

df = DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
dfRowImproper = [1,2,3,4]
#dfRowProper = DataFrame(arange(4)+1,columns=['A','B','C','D']) #will not work!!! because arange returns a vector, whereas DataFrame expect a matrix/array#
dfRowProper = DataFrame([arange(4)+1],columns=['A','B','C','D']) #will work


print df.append(dfRowImproper) #will make the 0 named column with 4 additional rows defined on this column

print df.append(dfRowProper) #will work as you would like as the column names are consistent

print df.append(DataFrame(np.random.randn(1,4))) #will define four additional columns to the df with 4 additional rows


print df.append(Series(dfRow,index=['A','B','C','D']), ignore_index=True) #works as you want

答案 1 :(得分:1)

您可以使用Series进行行插入:

df = pd.DataFrame(columns=['col1', 'col2'])
df = df.append(pd.Series([None]*2), ignore_index=True)
df["col1"][0] = 3.28

df看起来像:

   col1 col2
0  3.28  NaN