从列创建的DataFrame索引

时间:2019-08-27 12:11:29

标签: pandas python-2.7 dataframe indexing

我有一个数据框,我正在使用TIA填充彭博社的数据。当我查看df.index时,我看到我打算作为列的数据以似乎是多索引的形式呈现给我。 df.columns的输出如下:

索引([u'column1','u'column2'])

我尝试了reset_index的各种迭代,但无法解决这种情况。

1)TIA管理器如何使数据帧列作为索引读入?

2)如何正确地将这些列标识为列而不是多索引?

我要解决的最终问题是,当我尝试将此列添加到df2时,df2中该列的值显示为NaT。如下所示:

df2['column3'] = df1['column1']

Produces:

df2
column1 column2 column3
1135     32       NaT
1351      43      NaT
35        13      NaT
135       13      NaT

1 个答案:

答案 0 :(得分:1)

在注释中,df1df2的索引似乎完全不同

In [396]: df1.index
Out[400]: Index(['Jan', 'Feb', 'Mar', 'Apr', 'May'], dtype='object')

In [401]: df2.index
Out[401]: Index(['One', 'Two', 'Three', 'Four', 'Five'], dtype='object')

但是我们希望将<{>保存顺序从df1df2分配值。

通常,Pandas操作会尝试根据索引(和/或列)标签自动对齐值。 在这种情况下,我们希望忽略标签。为此,请使用

df2['columns3'] = df1['column1'].values

df1['column1'].values是一个NumPy数组。由于它没有索引,因此Pandas只是将数组中的值按顺序分配到df2['columns3']中。 如果右侧是列表或元组,则分配的行为将相同。 请注意,这也依赖于len(df1)等于len(df2)


例如,

import pandas as pd

df1 = pd.DataFrame(
    {"column1": [1135, 1351, 35, 135, 0], "column2": [32, 43, 13, 13, 0]},
    index=[u"Jan", u"Feb", u"Mar", u"Apr", u"May"],
)
df2 = pd.DataFrame(
    {"column1": range(len(df1))}, index=[u"One", u"Two", u"Three", u"Four", u"Five"]
)
df2["columns3"] = df1["column1"].values
print(df2)

收益

       column1  columns3
One          0      1135
Two          1      1351
Three        2        35
Four         3       135
Five         4         0

或者,您可以使两个Index相同,然后df2["columns3"] = df1["column1"]将产生相同的结果(但现在是因为索引标签已对齐):

df1.index = df2.index
df2["columns3"] = df1["column1"]

使Index匹配的另一种方法是在两个DataFrame上重置索引:

df1 = df1.reset_index()
df2 = df2.reset_index()
df2["columns3"] = df1["column1"]

reset_index默认将旧索引移动到名为index的列中(如果index.nameNone)。整数(从0开始)被分配为新的索引标签:

In [402]: df1.reset_index()
Out[410]: 
  index  column1  column2
0   Jan     1135       32
1   Feb     1351       43
2   Mar       35       13
3   Apr      135       13
4   May        0        0