将每个 groupby 对象的多列数据转换为一列
Transform multiple columns data into one column for every groupby object
我有一个数据框 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']
.
的列
匹配输出 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
我有一个数据框 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']
.
匹配输出 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