Python 基于另一个数据帧中的信息填充一个数据帧

Python 基于另一个数据帧中的信息填充一个数据帧,python,pandas,dataframe,validation,data-cleaning,Python,Pandas,Dataframe,Validation,Data Cleaning,我有两个大数据帧,但为了方便起见,我只展示了其中的一小部分。一种为以下形式(表1): 另一种形式为(表2): 其中,“C1_注释”列之后还有其他列(C2、C2_标志和C2_注释)。事实上,第一个表(C1、C2、C3、C4、C5、E1、E2、H1、H2、H3)的“V”列中的以下代码存在此列结构,但为简洁起见,我仅在表2中显示C1 我希望使用表1中的信息填充表2,这样它最终具有以下形式: | Country | Date | C1 | C1_flag | C1_notes | |----

我有两个大数据帧,但为了方便起见,我只展示了其中的一小部分。一种为以下形式(表1):

另一种形式为(表2):

其中,“C1_注释”列之后还有其他列(C2、C2_标志和C2_注释)。事实上,第一个表(C1、C2、C3、C4、C5、E1、E2、H1、H2、H3)的“V”列中的以下代码存在此列结构,但为简洁起见,我仅在表2中显示C1

我希望使用表1中的信息填充表2,这样它最终具有以下形式:

| Country |   Date   |  C1 | C1_flag | C1_notes  |
|------------------------------------------------|
| UK      | 20210319 | 3.0 |   1     | No Change | 
| USA     | 20210405 | 4.0 |   0     | New Policy|
| AUS     | 20210505 | NaN |   NaN   | NaN       |
| NZ      | 20210506 | NaN |   NaN   | NaN       |
其中,表2中的“C1”列使用表1中的“M”列作为其值,类似地,“C1_标志”列使用“标志”列。表2的填充基于表2中的“国家”和“日期”列与表1中的对应列相匹配


我希望“merge”类型的操作可以处理这个问题,但问题是值(C1…H3)是表1中的列值,而不是表2中的列名。我还认为这是Pandas中的Pivot/Stack/Melt类型操作,但事实并非如此,可能需要更一般的映射。我将如何进行这种对应(既适用于C1,也适用于其他C、E和H代码)?谢谢。

重新构造
第一个数据帧操作列,然后用此重新构造的数据帧更新另一个数据帧

k = df1.pivot(index=['Country','Date'] , columns= ['V'] , values= ['flag','M','notes'])
k.columns = ['_'.join(col[::-1]) if 'M' not in col else col[-1] for col in k.columns]
k = k[sorted(k.columns)]
df2 = df2.set_index(['Country', 'Date'])
df2.update(k)
输出:

                   C1 C1_flag   C1_notes
Country Date                            
UK      20210319  3.0       1   NoChange
USA     20210405  4.0       0  NewPolicy
AUS     20210505  NaN     NaN        NaN
NZ      20210506  NaN     NaN        NaN
完整代码:

from numpy import nan

d1 = {'Country': {0: 'UK', 1: 'UK', 2: 'USA', 3: 'CAN'}, 'Date': {0: 20210319, 1: 20210320, 2: 20210405, 3: 20210405}, 'flag': {0: 1, 1: 0, 2: 0, 3: 0},
      'M': {0: 3.0, 1: 2.0, 2: 4.0, 3: 1.0}, 'notes': {0: 'NoChange', 1: 'Extension', 2: 'NewPolicy', 3: 'Update'}, 'V': {0: 'C1', 1: 'C2', 2: 'C1', 3: 'C3'}}
d2 = {'Country': {0: 'UK', 1: 'USA', 2: 'AUS', 3: 'NZ'}, 'Date': {0: 20210319, 1: 20210405, 2: 20210505, 3: 20210506}, 'C1': {
    0: nan, 1: nan, 2: nan, 3: nan}, 'C1_flag': {0: nan, 1: nan, 2: nan, 3: nan}, 'C1_notes': {0: nan, 1: nan, 2: nan, 3: nan}}
df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)
k = df1.pivot(index=['Country', 'Date'], columns=[
              'V'], values=['flag', 'M', 'notes'])
k.columns = ['_'.join(col[::-1]) if 'M' not in col else col[-1]
             for col in k.columns]
k = k[sorted(k.columns)]
df2 = df2.set_index(['Country', 'Date'])
df2.update(k)


这回答了你的问题吗?合并类型操作不太可能有帮助,因为如前所述,值(C1…H3)是表1中的列值,而不是表1中的列名2@Prakash_S我已经添加了完整的代码。您能再试一次吗?在第一行中使用“pivot”会导致值错误,但pivot\u表会起作用。但由于某种原因,当我运行最后一行df2.update(k)时,我得到了一个不同的值错误:Buffer dtype不匹配,预期为“Python object”,但得到了“long long”,整个代码现在执行,但“C_1”notes列未更新。通过添加以下内容作为作用于df1的透视操作的额外参数,解决了上一个问题:aggfunc=lambda x:“”。join(str(v)表示x中的v)
                   C1 C1_flag   C1_notes
Country Date                            
UK      20210319  3.0       1   NoChange
USA     20210405  4.0       0  NewPolicy
AUS     20210505  NaN     NaN        NaN
NZ      20210506  NaN     NaN        NaN
from numpy import nan

d1 = {'Country': {0: 'UK', 1: 'UK', 2: 'USA', 3: 'CAN'}, 'Date': {0: 20210319, 1: 20210320, 2: 20210405, 3: 20210405}, 'flag': {0: 1, 1: 0, 2: 0, 3: 0},
      'M': {0: 3.0, 1: 2.0, 2: 4.0, 3: 1.0}, 'notes': {0: 'NoChange', 1: 'Extension', 2: 'NewPolicy', 3: 'Update'}, 'V': {0: 'C1', 1: 'C2', 2: 'C1', 3: 'C3'}}
d2 = {'Country': {0: 'UK', 1: 'USA', 2: 'AUS', 3: 'NZ'}, 'Date': {0: 20210319, 1: 20210405, 2: 20210505, 3: 20210506}, 'C1': {
    0: nan, 1: nan, 2: nan, 3: nan}, 'C1_flag': {0: nan, 1: nan, 2: nan, 3: nan}, 'C1_notes': {0: nan, 1: nan, 2: nan, 3: nan}}
df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)
k = df1.pivot(index=['Country', 'Date'], columns=[
              'V'], values=['flag', 'M', 'notes'])
k.columns = ['_'.join(col[::-1]) if 'M' not in col else col[-1]
             for col in k.columns]
k = k[sorted(k.columns)]
df2 = df2.set_index(['Country', 'Date'])
df2.update(k)