关于python:将两个Series组合成pandas中的DataFrame

Combining two Series into a DataFrame in pandas

我有两个具有相同(非连续)索引的Series s1s2。 如何将s1s2组合为DataFrame中的两列,并将其中一个索引保留为第三列?


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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系以上。


Pandas会自动对齐这些传递的序列并创建联合索引
它们恰好在这里相同。 reset_index将索引移动到列。

1
2
3
4
5
6
7
8
9
10
11
12
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


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

> = v0.23

1
a.to_frame().join(b)

<<十二

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


示例代码:

1
2
3
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相同的数据。


如果我可以回答这个问题。

将系列转换为数据框架的基本原理是要理解这一点

1.在概念层面,数据框中的每一列都是一个系列。

并且,每个列名都是映射到系列的键名。

如果牢记两个概念,可以考虑将系列转换为数据框的许多方法。
一个简单的解决方案是这样的:

在这里创建两个系列

1
2
3
4
5
import pandas as pd

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

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

使用所需的列名创建一个空数据框

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

使用映射概念将系列值放在数据框内

1
2
3
df['Column_name#1'] = series_1

df['Column_name#2'] = series_2

现在检查结果

1
df.head(5)

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

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

(这里甚至不需要index=s1.index)


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

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