如何将系列加入数据框?
Posted
技术标签:
【中文标题】如何将系列加入数据框?【英文标题】:How to join a Series to a DataFrame? 【发布时间】:2015-11-26 22:10:10 【问题描述】:有什么方法可以直接将 Series 加入 DataFrame?
连接将位于数据框的字段和系列的索引上。
我发现的唯一方法是先将系列转换为数据框,如下面的代码所示。
import numpy as np
import pandas as pd
df = pd.DataFrame()
df['a'] = np.arange(0, 4)
df['b'] = np.arange(100, 104)
s = pd.Series(data=np.arange(100, 103))
# this doesn't work
# myjoin = pd.merge(df, s, how='left', left_on='a', right_index=True)
# this does
s = s.reset_index()
# s becomes a Dataframe
# note you cannot reset the index of a series inplace
myjoin = pd.merge(df, s, how='left', left_on='a', right_on='index')
print myjoin
【问题讨论】:
抱歉,您只是要求添加一个新列,例如:df['new_col'] = df['a'].map(s)
?
我相信您问题中的解决方案(使s
成为带有reset_index()
的数据框)是正确的解决方案。
我想将Series中的列添加到数据框中,但是如何指定它应该是左外连接还是内连接,以及如何指定数据框的哪一列该系列的索引应该匹配吗?谢谢
在您的情况下,您应该使用 pd.join 而不是 pd.merge。文档说得很清楚:pandas.pydata.org/pandasdocs/stable/generated/… 但是你应该在组合两个之前定义系列的名称。
【参考方案1】:
试试 concat():
import numpy as np
import pandas as pd
df= pd.DataFrame()
df['a']= np.arange(0,4)
df['b']= np.arange(100,104)
s =pd.Series(data = np.arange(100,103))
new_df = pd.concat((df, s), axis=1)
print new_df
打印出来:
a b 0
0 0 100 100
1 1 101 101
2 2 102 102
3 3 103 NaN
【讨论】:
【参考方案2】:我猜http://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html 可能会有所帮助。
例如内/外连接。
pd.concat((df,s), axis=1)
Out[26]:
a b 0
0 0 100 100
1 1 101 101
2 2 102 102
3 3 103 NaN
In [27]: pd.concat((df,s), axis=1, join='inner')
Out[27]:
a b 0
0 0 100 100
1 1 101 101
2 2 102 102
【讨论】:
这是否加入索引?就我而言,索引不同,我想指定要加入的字段,但 concat 似乎没有像 pd.merge 这样的 on、left_on、right_on 参数 是的,它加入索引。只解决这部分>>我想将Series中的列添加到数据框中,但是如何指定它应该是左外连接还是内连接 mmm,那么使用 reset_index 从系列转换为数据帧的唯一方法是什么?这会将索引转换为列,该列将添加到合并函数的结果中。因此,我需要将其删除。这一切似乎都是不必要的复杂! 真的不知道,也许还有其他方法,但我不知道也找不到。【参考方案3】:这是一个非常晚的答案,但对我有用的是构建一个数据框,其中包含您要在系列中检索的列,将此系列命名为您需要的索引, 将系列附加到数据框(如果您在系列中有补充元素,则将它们添加到数据框,这在某些应用程序中可能很方便),然后通过此索引将最终数据框连接到要扩展的原始数据框。同意这不是直接的,但如果你有很多系列,这仍然是最方便的方法,而不是先在数据框中转换每个。
【讨论】:
以上是关于如何将系列加入数据框?的主要内容,如果未能解决你的问题,请参考以下文章