我有两个系列s1和s2具有相同的(非连续的)索引。我如何结合s1和s2作为数据帧中的两列,并保持其中一个索引作为第三列?
s1
s2
示例代码:
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具有相同的数据。
dict
DataFrame
Series
data['idx_col']
data.index
我不确定我完全理解你的问题,但这是你想做的吗?
pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)
(index=s1.index在这里甚至不是必需的)
index=s1.index
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属性作为列(否则它只是简单地为它们编号):
concat
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
v0.23
a.to_frame().join(b)
& lt;v0.23
a.to_frame().join(b.to_frame())
基于join()的解决方案的简化:
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将在新数据帧的一列中保存旧索引(为简单起见,这里省略了索引)。
drop=False
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