【发布时间】:2016-09-10 23:19:42
【问题描述】:
我有两个 pandas 数据帧,并希望根据以下内容生成结果:
*DataFrame 1 具有浮点数,第二个 DataFrame 中的值无关紧要。 两个 DataFrame 的列数相同,但 df1 有一些额外的行,因为它的索引中有更多条目,分布在整个索引中。
问题
如何获得 df2 形状的 DataFrame 但使用 df1 的值的约束条件是,如果在 df2 中没有的索引处存在 df1 值,则必须将 df1 值添加到先前的有效索引(即非 NaN)在 df2 的该列中。 res_df 显示了从 df1 和 df2 导出的结果。*
数据帧 1
import pandas as pd
df1_col1 = pd.Series([2.5, .5, 1, 1, .5, .5, 2], index=[0.0, 2.5, 3.0, 4.0, 5.0, 5.5, 6])
df1_col2 = pd.Series([2, 2, 2, 1, 1], index=[0.0, 2.0, 4.0, 6.0, 7.0])
df1 = pd.concat([df1_col1, df1_col2], axis=1)
>>> df1
0 1
0.0 2.5 2
2.0 NaN 2
2.5 0.5 NaN
3.0 1.0 NaN
4.0 1.0 2
5.0 0.5 NaN
5.5 0.5 NaN
6.0 2.0 1
7.0 NaN 1
数据帧 2
df2_col1 = pd.Series(['val', 'val', 'val', 'val', 'val', 'val'], index=[0.0, 2.5, 3.0, 5.0, 5.5, 6])
df2_col2 = pd.Series(['val', 'val', 'val', 'val'], index=[0.0, 2.0, 6.0, 7.0])
df2 = pd.concat([df2_col1, df2_col2], axis=1)
>>> df2
0 1
0.0 val val
2.0 NaN val
2.5 val NaN
3.0 val NaN
5.0 val NaN
5.5 val NaN
6.0 val val
7.0 NaN val
预期结果
res_col1 = pd.Series([2.5, .5, 2, .5, .5, 2], index=[0.0, 2.5, 3.0, 5.0, 5.5, 6])
res_col2 = pd.Series([2, 4, 1, 1], index=[0.0, 2.0, 6.0, 7.0])
res_df = pd.concat([res_col1, res_col2], axis=1)
>>> res_df
0 1
0.0 2.5 2
2.0 NaN 4
2.5 0.5 NaN
3.0 2.0 NaN
5.0 0.5 NaN
5.5 0.5 NaN
6.0 2.0 1
7.0 NaN 1
我在 Linux Ubuntu 上使用 pandas 0.18.0,该解决方案需要适用于 python 2.7.6 和 python 3.5.1。谢谢。
【问题讨论】:
-
你能给出一个更清晰的例子来说明你所指的渔获物吗?
-
df1 和 df2 之间的区别在于 df2 中的索引 4.0 处没有值,因此在 res_df 中,来自 df1 的该索引处的值被添加到其各自列中先前的有效索引中。
-
如果没有“以前的有效索引”怎么办?是否应该丢弃该值?或者假设它不会发生是否安全?
-
@ptrj 在这种情况下,可以安全地假设如果 df1 中有一个值,而 df2 中没有一个值,那么总会有一个先前的有效索引。