将两个Series组合成pandas中的DataFrame

use*_*289 241 python series dataframe pandas

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

And*_*den 361

我认为这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
Run Code Online (Sandbox Code Playgroud)

注意:这延伸到2系以上.

  • 这实际上避免了复制(与dict解决方案相比) (5认同)
  • @dafinguzman什么"不断重用这个函数"意味着你应该更喜欢做concat**一次**`pd.concat([list_of_dataframes])`vs多次连续`new_df = pd.DataFrame(); 对于list_of_dsf中的df:new_df = pd.concat([new_df,df])`或类似的. (2认同)

Jef*_*eff 31

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
Run Code Online (Sandbox Code Playgroud)


swm*_*mfg 26

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

a.to_frame().join(b)
Run Code Online (Sandbox Code Playgroud)

^^如果试图'加入'两只熊猫系列,这将无效

  • 也许这更合适:a.to_frame(name ='a').join(b.to_frame(name ='b')) (3认同)

jbn*_*jbn 13

示例代码:

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})
Run Code Online (Sandbox Code Playgroud)

熊猫允许您创建一个DataFramedictSeries为值和列名作为关键字.当它找到一个Series值时,它使用Series索引作为索引的一部分DataFrame.这种数据对齐是Pandas的主要特权之一.因此,除非您有其他需求,否则新创建的DataFrame重复价值.在上面的例子中,data['idx_col']具有与之相同的数据data.index.


小智 7

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

df = a.to_frame().join(b)
Run Code Online (Sandbox Code Playgroud)


Sat*_*esh 7

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

将系列转换为数据框的基本原理是要了解

从概念上讲,数据框中的每一列都是一个序列。

2.而且,每个列名都是映射到系列的键名。

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

在这里创建两个系列

import pandas as pd

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

series_2 = pd.Series(list(range(20,30)))
Run Code Online (Sandbox Code Playgroud)

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

df = pd.DataFrame(columns = ['Column_name#1', 'Column_name#1'])
Run Code Online (Sandbox Code Playgroud)

使用映射概念将序列值放入数据框内

df['Column_name#1'] = series_1

df['Column_name#2'] = series_2
Run Code Online (Sandbox Code Playgroud)

立即检查结果

df.head(5)
Run Code Online (Sandbox Code Playgroud)


Joh*_*ohn 7

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

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
Run Code Online (Sandbox Code Playgroud)

假设您不关心索引是否匹配,解决方案是在连接两个系列之前重新索引它们。如果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
Run Code Online (Sandbox Code Playgroud)


小智 5

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

pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)
Run Code Online (Sandbox Code Playgroud)

index=s1.index这里甚至没有必要)