我有以下两个数据框:
import pandas as pd
from datetime import datetime
df_two = pd.DataFrame({'A': ['Jan', 'Jan', 'Feb', 'Feb', 'March', 'March'],
'B': ['Feb', 'Feb', 'March', 'March', 'Jan', 'Jan'],
'C': ['March', 'March', 'Jan', 'Jan', 'Feb', 'Feb']},
index=[datetime(2020, 1, 1), datetime(2020, 1, 2),
datetime(2020, 1, 3), datetime(2020, 1, 4),
datetime(2020, 1, 5), datetime(2020, 1,6)] )
df_one = pd.DataFrame({'series_one': [2, 5, 16, 17, 88, 89],
'series_two': [12, 15, 86, 87, 8, 9],
'series_three': [82, 85, 6, 7, 18, 19]},
index=[datetime(2020, 1, 1), datetime(2020, 1, 2),
datetime(2020, 1, 3), datetime(2020, 1, 4),
datetime(2020, 1, 5), datetime(2020, 1, 6)])
看起来像这样:
df_one
series_one series_two series_three
2020-01-01 2 12 82
2020-01-02 5 15 85
2020-01-03 16 86 6
2020-01-04 17 87 7
2020-01-05 88 8 18
2020-01-06 89 9 19
和
df_two
A B C
2020-01-01 Jan Feb March
2020-01-02 Jan Feb March
2020-01-03 Feb March Jan
2020-01-04 Feb March Jan
2020-01-05 March Jan Feb
2020-01-06 March Jan Feb
我想使用两个数据框的信息并得到以下视图:
Jan Feb March
2020-01-01 2 12 82
2020-01-02 5 15 85
2020-01-03 6 16 86
2020-01-04 7 17 87
2020-01-05 88 18 88
2020-01-06 89 19 89
我该怎么做?
答案 0 :(得分:1)
如果问题复杂得多,它可能无法解决您的问题,但它可能是一个起点:
pd.DataFrame(list(df_one.apply(lambda x: [x[list(df_two.loc[x.name]=="Jan").index(True)],
x[list(df_two.loc[x.name]=="Feb").index(True)],
x[list(df_two.loc[x.name]=="March").index(True)]],axis = 1)),
index = df_one.index,
columns = ["Jan","Feb", "March"])
输出:
Jan Feb March
2020-01-01 2 12 82
2020-01-02 5 15 85
2020-01-03 6 16 86
2020-01-04 7 17 87
2020-01-05 8 18 88
2020-01-06 9 19 89
答案 1 :(得分:1)
您可以尝试使用apply
:
def func(row):
y = df_one.loc[row.name]
u = (dict(zip(row.values,y.values)))
return u
res = pd.DataFrame(list(df_two.apply(func,axis=1)), index=df_two.index)
资源:
Jan | 二月 | 三月 | |
---|---|---|---|
2020-01-01 | 2 | 12 | 82 |
2020-01-02 | 5 | 15 | 85 |
2020-01-03 | 6 | 16 | 86 |
2020-01-04 | 7 | 17 | 87 |
2020-01-05 | 8 | 18 | 88 |
2020-01-06 | 9 | 19 | 89 |
用 (Jan, Feb, March)
映射月份 values
映射将如下所示:
{'Jan': 2, 'Feb': 12, 'March': 82}
{'Jan': 5, 'Feb': 15, 'March': 85}
{'Feb': 16, 'March': 86, 'Jan': 6}
{'Feb': 17, 'March': 87, 'Jan': 7}
{'March': 88, 'Jan': 8, 'Feb': 18}
{'March': 89, 'Jan': 9, 'Feb': 19}
使用它您可以创建一个数据框。
假设它们具有相同的索引和相同的大小。
单层解决方案:
res = pd.DataFrame([dict(zip(df_two.to_numpy()[idx], l)) for idx,l in enumerate(df_one.to_numpy())], index=df_one.index)
如果您想处理通用索引。
i = df_one.index.intersection(df_two.index)
res = pd.DataFrame([dict(zip(df_two.loc[i].to_numpy()[idx], l)) for idx,l in enumerate(df_one.loc[i].to_numpy())], index=i)
答案 2 :(得分:1)
让我们使用一些 Pandas 整形和连接方法:
df_one = df_one.rename(columns=dict(zip(df_one.columns, df_two.columns)))
df_out = df_one.stack().reset_index(name='value').merge(df_two.stack().reset_index(name='month'))
df_out = df_out.pivot('level_0', 'month', 'value').rename_axis(index=None, columns=None)
print(df_out)
输出:
Feb Jan March
2020-01-01 12 2 82
2020-01-02 15 5 85
2020-01-03 16 6 86
2020-01-04 17 7 87
2020-01-05 18 8 88
2020-01-06 19 9 89
详情: