我有两个系列s1
和s2
具有相同(非连续)索引。如何将s1
和s2
合并为DataFrame中的两列,并将其中一个索引保留为第三列?
答案 0 :(得分:324)
我认为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个以上系列。
答案 1 :(得分: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
答案 2 :(得分:21)
如果两者都有相同的索引,为什么不使用.to_frame?
> = v0.23
a.to_frame().join(b)
<强>&LT; v0.23
强>
a.to_frame().join(b.to_frame())
答案 3 :(得分:11)
示例代码:
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允许您从DataFrame
创建dict
,其中Series
为值,列名称为键。当它找到Series
作为值时,它会将Series
索引用作DataFrame
索引的一部分。这种数据对齐是Pandas的主要特权之一。因此,除非您有其他需求,否则新创建的DataFrame
具有重复值。在上面的示例中,data['idx_col']
与data.index
具有相同的数据。
答案 4 :(得分:4)
我不确定我完全理解您的问题,但这是您想要做的吗?
pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)
(此处甚至不需要index=s1.index
)
答案 5 :(得分:2)
基于join()
简化解决方案:
df = a.to_frame().join(b)
答案 6 :(得分:1)
如果我可以回答这个问题。
将系列转换为数据框的基本原理是了解这一点
1。从概念上讲,数据框中的每一列都是一个序列。
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)
答案 7 :(得分:1)
我使用了pandas将我的numpy数组或iseries转换为数据框,然后添加并按键将其他附加列作为“预测”。如果您需要将数据框转换回列表,请使用values.tolist()
output=pd.DataFrame(X_test)
output['prediction']=y_pred
list=output.values.tolist()
答案 8 :(得分:1)
如果您尝试加入等长的Series,但是它们的索引不匹配(这是常见的情况),那么将它们串联将在它们不匹配的任何地方生成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
假设您不在乎索引是否匹配,解决方案是在串联两个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