在熊猫中将两个系列组合成一个数据框架

我有两个系列s1s2具有相同的(非连续的)索引。我如何结合s1s2作为数据帧中的两列,并保持其中一个索引作为第三列?

505537 次浏览

示例代码:

a = pd.Series([1,2,3,4], index=[7,2,8,9])
b = pd.Series([5,6,7,8], index=[7,2,8,9])
data = pd.DataFrame({'a': a,'b':b, 'idx_col':a.index})

Pandas允许你从dict创建一个DataFrame,其中Series为值,列名为键。当它找到一个Series作为值时,它使用Series索引作为DataFrame索引的一部分。这种数据对齐是Pandas的主要优势之一。因此,除非你有其他需要,否则新创建的DataFrame具有重复的值。在上面的例子中,data['idx_col']data.index具有相同的数据。

我不确定我完全理解你的问题,但这是你想做的吗?

pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)

(index=s1.index在这里甚至不是必需的)

Pandas将自动对齐这些序列并创建联合索引 它们在这里是一样的。reset_index将索引移动到一个列
In [2]: s1 = Series(randn(5),index=[1,2,4,5,6])


In [4]: s2 = Series(randn(5),index=[1,2,4,5,6])


In [8]: DataFrame(dict(s1 = s1, s2 = s2)).reset_index()
Out[8]:
index        s1        s2
0      1 -0.176143  0.128635
1      2 -1.286470  0.908497
2      4 -0.995881  0.528050
3      5  0.402241  0.458870
4      6  0.380457  0.072251

我认为concat是一个很好的方法。如果它们存在,它使用Series的name属性作为列(否则它只是简单地为它们编号):

In [1]: s1 = pd.Series([1, 2], index=['A', 'B'], name='s1')


In [2]: s2 = pd.Series([3, 4], index=['A', 'B'], name='s2')


In [3]: pd.concat([s1, s2], axis=1)
Out[3]:
s1  s2
A   1   3
B   2   4


In [4]: pd.concat([s1, s2], axis=1).reset_index()
Out[4]:
index  s1  s2
0     A   1   3
1     B   2   4

注意:这扩展到2系列以上。

如果两者有相同的索引,为什么不直接使用.to_frame呢?

> = v0.23

a.to_frame().join(b)

& lt;v0.23

a.to_frame().join(b.to_frame())

基于join()的解决方案的简化:

df = a.to_frame().join(b)

请允许我回答这个问题。

将序列转换为数据帧的基本原理是理解这一点

< em > 1。在概念层面上,数据帧中的每一列都是一个系列

< em > 2。并且,每个列名都是一个映射到一个系列的键名

如果你记住了以上两个概念,你可以想到很多方法将序列转换为数据帧。 一个简单的解决方案是这样的:

在这里创建两个系列

import pandas as pd


series_1 = pd.Series(list(range(10)))


series_2 = pd.Series(list(range(20,30)))

创建一个空的数据帧,只需要列的名称

df = pd.DataFrame(columns = ['Column_name#1', 'Column_name#1'])

利用映射概念将序列值放入数据帧中

df['Column_name#1'] = series_1


df['Column_name#2'] = series_2

现在检查结果

df.head(5)

我使用pandas将我的numpy数组或iseries转换为一个数据帧,然后添加和添加额外的列键作为“预测”。如果你需要将数据帧转换回列表,则使用values.tolist()

output=pd.DataFrame(X_test)
output['prediction']=y_pred


list=output.values.tolist()

如果您试图连接长度相等但它们的索引不匹配的Series(这是一种常见的情况),那么连接它们将在它们不匹配的地方生成NAs。

x = pd.Series({'a':1,'b':2,})
y = pd.Series({'d':4,'e':5})
pd.concat([x,y],axis=1)


#Output (I've added column names for clarity)
Index   x    y
a      1.0  NaN
b      2.0  NaN
d      NaN  4.0
e      NaN  5.0

假设您不关心索引是否匹配,解决方案是在连接两个Series之前重新索引它们。如果drop=False,这是默认值,那么Pandas将在新数据帧的一列中保存旧索引(为简单起见,这里省略了索引)。

pd.concat([x.reset_index(drop=True),y.reset_index(drop=True)],axis=1)


#Output (column names added):
Index   x   y
0       1   4
1       2   5