【问题标题】:Apply rules to transpose dataframe in Python应用规则在 Python 中转置数据框
【发布时间】:2019-12-03 11:44:54
【问题描述】:

我有一个如下所示的数据框:

df = pd.DataFrame({'person_id' :[1,1,1,2,2,2,2,2,2],'level_1': ['L1FR','L1Date','L1value','L1FR','L1Date','L1value','L2FR','L2Date','L2value'], 'val3':['Fasting','11/4/2005',1.33,'Random','18/1/2007',4.63,'Fasting','18/1/2017',8.63]})

但我希望我的输出数据框如下所示:

请注意,concept_id = 123 表示“禁食”,456 表示“随机”。我在另一个 csv 文件中有此信息(密钥)。如何链接所有这些?

但是,我设法走到了这里:

d1 = s1[s1['level_1'].str.contains('Date')]
d2 = s1[~s1['level_1'].str.contains('Date')]


d1['g'] = d1.groupby('person_id').cumcount()
d2['g'] = d2.groupby('person_id').cumcount()

d3 = pd.merge(d1,d2,on=["person_id",'g'],how='left').drop(['g','level_1_x','level_1_y'], axis=1)

请注意,我展示的是单个 csv 数据文件和包含 concept_ids 的单个哈希/密钥文件。实时,我有 30 多个 csv 文件和 1 个哈希/密钥文件。

所以哈希文件保持不变,但数据文件经常变化。

例如,这个文件有两个概念 "Fasting" 和 "Random" ,可以通过查看哈希文件将其替换为 123,456。同样,其他数据文件可能包含“Sick”、“Healthy”等术语,应替换为 135,579 等。

但数据格式保持不变。你能帮我实现吗?

** 更新输出截图**

** cum count 分组不匹配 **

我希望根据值的出现次数,每个组的所有这些值都应该具有相同的数字(例如:1,1,1 或 10,10,10)。我对吗?但不知道为什么它不同。此外,我的输入数据框没有 NA

【问题讨论】:

    标签: python python-3.x pandas list dataframe


    【解决方案1】:

    您正在这里寻找支点。不过,您需要做一些额外的工作来指定旋转数据框的列和索引。这是一种方法:

    g = df.level_1.str[2:]
    ix = g.groupby(g).cumcount()
    out = (df.pivot_table(values = 'val3', 
                   columns= g, 
                   index = g.groupby(g).cumcount(), 
                   aggfunc='first'))
    
    out['person_id'] = df.loc[ix.groupby(ix).idxmax(), 'person_id'].values
    
    print(out)
    
    level_1       Date       FR value  person_id
    0        11/4/2005  Fasting  1.33          1
    1        18/1/2007   Random  4.63          2
    2        18/1/2017  Fasting  8.63          2
    

    对于ConceptID 列,您只需为map 相应的值创建一个字典

    【讨论】:

    • 但是 person_id 列丢失了。你能帮我搞定吗?
    • 还有其他方法可以获取 person_id 吗?并且还要识别列?我的意思是可以有超过 100 列。例如,它可以从 L1date 开始,也可以到 L123date。所以在这种情况下,str[2:] 可能并不总是有效
    • 我看到 idxmax() 是总和。但是从它的名字看起来,它会找到最大值。有什么链接可以阅读这个吗?
    • 是的,这只是获取ix中每个组的第一个索引的一种方式。每个组的person_id 中的所有值都相同,索引并不重要@AVLES
    • 您好,感谢您的回复。我试过你的解决方案。它工作正常,但对于一半的记录,它返回 Nan 的 'FR' 和 'value' 列。您能否分享一些关于看到 NA 的原因的建议。我的 ip 数据框就像问题中显示的那样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多