Pandas - 将列表附加到现有数据框,与列相同

时间:2017-04-13 04:54:21

标签: python pandas dataframe

好的,所以我有一个预先创建的数据帧,我尝试将一个列表附加到它。在简化版本中,问题如下。

df = pd.DataFrame({'One': [],
                'Another' : [],
                'Third' : [],
                'Last' : []})

然后我用列表做一些事情:

new_obj = []
new_obj.append('1')
new_obj.append('2')
#I have to do the extend operation here
new_obj.extend(['3','4'])

现在我只想将我的new_obj列表添加到我的数据框中,对象的顺序与数据帧中我想要的顺序相同。

所以我只是这样做:

df.loc[len(df.index)] = new_obj

结果我有:

  Another Last One Third
0       1    2   3     4

为什么?为什么它将列顺序更改为aphabetic列顺序。如何在追加时保留它?

4 个答案:

答案 0 :(得分:2)

您的行df.loc[len(df.index)] = new_obj未更改列的顺序。

字典键是无序的,因此当您将字典传递给pd.DataFrame()以创建数据帧时,您的列不一定按照您编写它们的顺序。

尝试此确认:

df = pd.DataFrame({'One': [],
                'Another' : [],
                'Third' : [],
                'Last' : []})

df.columns
  

索引(['另一个','最后','一个','三'],dtype ='对象& #39)

...如果你关心列的顺序,而是像这样初始化你的df:

columns = ['one', 'another', 'third', 'last']
df = pd.DataFrame(columns=columns)

答案 1 :(得分:2)

请注意,Python中的dict本质上是无序的。为了指定您可以编写的DataFrame(或用户collections.OrderedDict)的正确顺序:

df = pd.DataFrame({'One': [],
                   'Another' : [],
                   'Third' : [],
                   'Last' : []}, columns=["One", "Another", "Third", "Last"])

另一方面,如果你真的不关心DataFrame中的顺序,你可以通过简单地使用{{1}明确定义你正在添加list的列。而是:

dict

答案 2 :(得分:1)

正如其他人提到的那样,没有订购dictonary键。如果你想订购dict使用orderddict,如下所示

import pandas as pd
import collections

mydict = collections.OrderedDict((('One', []),
                ('Another', []),
                ('Third', []),
                ('Last', [])))

df = pd.DataFrame.from_dict(mydict)

new_obj = []
new_obj.append('1')
new_obj.append('2')
#I have to do the extend operation here
new_obj.extend(['3','4'])
df.loc[len(df.index)] = new_obj
print df

结果

  One Another Third Last
0   1       2     3    4

答案 3 :(得分:1)

append与参数ignore_index=True

一起使用
df = pd.DataFrame(columns='One Another Third Last'.split())

new_obj = []
new_obj.append('1')
new_obj.append('2')
#I have to do the extend operation here
new_obj.extend(['3','4'])

# notice I created a `pd.Series` with `df.columns` as the index
df.append(pd.Series(new_obj, df.columns), ignore_index=True)

  One Another Third Last
0   1       2     3    4