为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas 将行合并和转换为列和特征工程

Pandas 将行合并和转换为列和特征工程

杨__羊羊 2022-05-24 17:08:34
我有两张这样的桌子,表 AID_1   Value_1   Value_21      ABC       N_12      DEF       N_23      GHI       N_3表 BB_ID_1 B_Value_1     Value_21      abcd            N_11      abc             N_23      GHI_1           N_33      GHI_2           N_33      GHI_3           N_33      GHI_4           N_3特定数字的记录数恰好是 ID。在这种情况下,它是 4。但它每次都在变化。我想做一个左合并(从表 A 到表 B),然后将它转换成这样的东西。ID_1   Value_1   Value_2     B_Value_1_1    B_Value_2_1  B_Value_1_2      B_Value_2_2     B_Value_1_3     B_Value_2_3    B_Value_1_4    B_Value_2_4        1      ABC       N_1         abcd             N_1           abc          N_22      DEF       N_23      GHI       N_3         GHI_1            N_3          GHI_2         N_3                  GHI_3            N_3             GHI_4            N_3并添加两个额外的列。count_match 基本上是检查 Value_1 到 B_Value_1_1 到 B_value_1_4 的匹配次数numberofvalue 基本上是检查从 B_Value_1_1 到 B_value_1_4 存在的匹配数。在这种情况下,额外的列(count_match 和 numberofvalues)看起来像ID_1  count_match numberofvalues1      1               2   2      0               0 3      0               4 我怎样才能做到这一点。
查看完整描述

1 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

这是实现问题第一部分预期结果的一种方法,第二部分在以预期格式获取数据后应该是直截了当的。


1. 预处理


预处理表 B,使其每个 ID 都有一行。您可以执行groupbyB_ID_1 并传递一个函数来展平组:


def flatten_group(x):

    n = len(x)

    vals = x.iloc[:,1:].values.flatten().reshape(1, -1)

    names = np.char.add(

        np.array(['B_Value_1_', 'B_Value_2_']*n),

        np.repeat(np.arange(1, n+1).astype(str), 2)

    )

    return pd.DataFrame(data=vals, columns=names)

b_prep = b.groupby('B_ID_1').apply(flatten_group).reset_index(level=0)

2.左连接


在这里你只需做一个左连接


pd.merge(a,b_prep,how='left', left_on='ID_1', right_on='B_ID_1').drop('B_ID_1', axis=1)

细节


b_prep


   B_ID_1 B_Value_1_1 B_Value_2_1 B_Value_1_2 B_Value_2_2 B_Value_1_3  \

0       1        abcd         N_1         abc         N_2         NaN   

0       3       GHI_1         N_3       GHI_2         N_3       GHI_3   


  B_Value_2_3 B_Value_1_4 B_Value_2_4  

0         NaN         NaN         NaN  

0         N_3       GHI_4         N_3

pd.merge


   ID_1 Value_1 Value_2 B_Value_1_1 B_Value_2_1 B_Value_1_2 B_Value_2_2  \

0     1     ABC     N_1        abcd         N_1         abc         N_2   

1     2     DEF     N_2         NaN         NaN         NaN         NaN   

2     3     GHI     N_3       GHI_1         N_3       GHI_2         N_3   


  B_Value_1_3 B_Value_2_3 B_Value_1_4 B_Value_2_4  

0         NaN         NaN         NaN         NaN  

1         NaN         NaN         NaN         NaN  

2       GHI_3         N_3       GHI_4         N_3


查看完整回答
反对 回复 2022-05-24
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号