【问题标题】:Transform multiple columns data into one column for every groupby object将每个 groupby 对象的多列数据转换为一列
【发布时间】:2019-08-25 02:53:52
【问题描述】:

我有一个数据框df:

df = pd.DataFrame({'ID': ['1','1','2'], \ 'diag1': ['C1.10', 'E10.40','F20.00'], \ 'diag2': ['M30', '','O92.15'], \ 'diag3': ['E15.34', 'H20.00','']})

我想创建一个新的数据框df1,它应该包含df['diag1']df['diag2']df['diag3'] 列中存在的所有信息,基于每个ID 到一列df1['diag_all']

我应该使用转换方法来实现这一点还是有其他功能可以做到这一点?

这就是我想要实现的目标: ID diag_all 0 1 C1.10 1 1 E10.40 2 1 F20.00 3 1 M30 4 1 O92.15 5 2 E15.34 6 2 H20.00

请记住,我不想在此转换期间使用实际数据框中的许多其他列。因此,我们需要在df 中指定要转换为df1['diag_all'] 的列。

【问题讨论】:

  • 你需要df.replace('',np.nan).melt('ID').dropna() ??
  • 这也很棒。然后我可以通过 ID 对其进行排序并获得所需的结果。谢谢
  • 是的,使用sort_values()

标签: pandas python-3.5 pandas-groupby


【解决方案1】:

匹配输出 DataFrame,对要省略的空白类型和新索引有一定的容忍度。

import pandas as pd
import numpy as np

df = pd.DataFrame({'ID': ['1','1','2'], \
                   'diag1': ['C1.10', 'E10.40','F20.00'], \
                   'diag2': ['M30', '','O92.15'], \
                   'diag3': ['E15.34', 'H20.00','']})

df.replace(r'^\s*$', np.nan, regex=True, inplace=True)
df1 = pd.melt(df, id_vars=['ID'], value_vars=['diag1', 'diag2', 'diag3'], value_name='diag_all')[['ID', 'diag_all']]
df1 = df1.sort_values(['ID']).dropna().reset_index().drop(['index'], axis=1)
print(df1)
  ID diag_all
0  1    C1.10
1  1   E10.40
2  1      M30
3  1   E15.34
4  1   H20.00
5  2   F20.00
6  2   O92.15

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 2014-10-18
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    相关资源
    最近更新 更多