将pandas dataframe index转换为基于数据帧值,同时将值更改为布尔值

时间:2017-01-13 18:54:17

标签: python pandas dataframe

我有两个公司名称数据集,两者之间有命名差异(例如:Merck& Co. vs Merck& Co vs Merck& Co.,Inc。)

我正在尝试创建一个"地图"所有独特的变体" Merck"匹配" Merck& 。共#&34;

我目前的做法是创建一个字典,转换为数据帧,并理想地执行下面描述的转换:

    Company 1        Company 2         Company 3
0   Co1 variant 0    Co1 variant 0     Co3 variant 0
1   Co1 variant 1    Co2 variant 1     
2   Co1 variant 2       

应该成为:

                  Company 1       Company 2         Company 3
Co1 variant 0     True            True              False
Co1 variant 1     True            False             False
Co1 variant 2     True            False             False
Co2 variant 0     False           True              False
Co2 variant 1     False           True              False
Co3 variant 0     False           True              True

从这里开始,如果每行中只有1 True个值,我会将此命名变量与列标题匹配,否则我会将其与自身匹配;允许最终数据集看起来像

    Variants        Matched Name
0   Co1 variant 0   Co1 variant 0
1   Co1 variant 1   Company 1
2   Co1 variant 2   Company 1
3   Co2 variant 1   Company 2
4   Co3 variant 0   Company 3

提前感谢您的任何意见,如果问题不够明确,我也很乐意进一步澄清。

1 个答案:

答案 0 :(得分:1)

您可以堆叠原始数据框,然后按行ID编号和变体分组,检查每组的行数,如果只有一行,则选择公司否则选择变体本身:

(df.stack().rename("Variants").rename_axis(("RowId", "Company")).reset_index()
 .groupby(["RowId", "Variants"])
 .apply(lambda g: g.Company.iloc[0] if g.Company.size == 1 else g.Variants.iloc[0])
 .rename("Matched Names").reset_index().drop("RowId", axis = 1))

enter image description here