用最简单的索引在python中转置一列

用最简单的索引在python中转置一列,python,pandas,transpose,Python,Pandas,Transpose,我有以下数据(data\u current): 我想做的是转置其中一列,这样就不用有多行相同的药物和不同的疾病,而是每个药物有一行,多个疾病列。保持索引尽可能简单也很重要,即0,1,2。。。i、 我不想将“medicines”指定为索引列,因为我会将其合并到其他键上。 因此,我需要获取所需的数据 data_needed=pd.DataFrame({'medicine':['green tea','fried tomatoes','meditation'],'disease_1':['acne',

我有以下数据(
data\u current
):

我想做的是转置其中一列,这样就不用有多行相同的药物和不同的疾病,而是每个药物有一行,多个疾病列。保持索引尽可能简单也很重要,即0,1,2。。。i、 我不想将“medicines”指定为索引列,因为我会将其合并到其他键上。 因此,我需要获取所需的数据

data_needed=pd.DataFrame({'medicine':['green tea','fried tomatoes','meditation'],'disease_1':['acne','hypertension','cancer'], 'disease_2':['np.nan','np.nan','lupus']})
data_needed

我想你想要一张透视表。有关详细信息,请查看此链接-->

你认为这个项目的输出可以接受吗


data\u current.pivot(index='medicine',columns='disease',values='disease')
我想您需要一个pivot表。有关详细信息,请查看此链接-->

你认为这个项目的输出可以接受吗

data\u current.pivot(index='medicine',columns='disease',values='disease')

这将使我们:

In [548]: dc
Out[548]: 
        disease        medicine disease_header
0          acne       green tea     diseases_0
1  hypertension  fried tomatoes     diseases_1
2        cancer      meditation     diseases_2
3         lupus      meditation     diseases_3
最后,我们可以转向:

    In [547]: dc.pivot(columns='disease_header', index='medicine', values='disease').reset_index()
Out[547]: 
disease_header        medicine diseases_0    diseases_1 diseases_2 diseases_3
0               fried tomatoes        NaN  hypertension        NaN        NaN
1                    green tea       acne           NaN        NaN        NaN
2                   meditation        NaN           NaN     cancer      lupus
这将使我们:

In [548]: dc
Out[548]: 
        disease        medicine disease_header
0          acne       green tea     diseases_0
1  hypertension  fried tomatoes     diseases_1
2        cancer      meditation     diseases_2
3         lupus      meditation     diseases_3
最后,我们可以转向:

    In [547]: dc.pivot(columns='disease_header', index='medicine', values='disease').reset_index()
Out[547]: 
disease_header        medicine diseases_0    diseases_1 diseases_2 diseases_3
0               fried tomatoes        NaN  hypertension        NaN        NaN
1                    green tea       acne           NaN        NaN        NaN
2                   meditation        NaN           NaN     cancer      lupus

这里有一个实现输出的方法

首先,
groupby
medicine
上获取
疾病
列表

In [368]: md = (data_current.groupby('medicine')
                            .apply(lambda x: x['disease'].tolist())
                            .reset_index())

In [369]: md
Out[369]:
         medicine                0
0  fried tomatoes   [hypertension]
1       green tea           [acne]
2      meditation  [cancer, lupus]
然后将列中的列表转换为单独的列

In [370]: dval = pd.DataFrame(md[0].tolist(), )

In [371]: dval
Out[371]:
              0      1
0  hypertension   None
1          acne   None
2        cancer  lupus
现在,您可以使用
dval

In [372]: md = md.drop(0, axis=1)

In [373]: data_final = pd.concat([md, dval], axis=1)
然后,根据需要重命名这些列

In [374]: data_final.columns = ['medicine', 'disease_1', 'disease_2']

In [375]: data_final
Out[375]:
         medicine     disease_1 disease_2
0  fried tomatoes  hypertension      None
1       green tea          acne      None
2      meditation        cancer     lupus

这里有一个实现输出的方法

首先,
groupby
medicine
上获取
疾病
列表

In [368]: md = (data_current.groupby('medicine')
                            .apply(lambda x: x['disease'].tolist())
                            .reset_index())

In [369]: md
Out[369]:
         medicine                0
0  fried tomatoes   [hypertension]
1       green tea           [acne]
2      meditation  [cancer, lupus]
然后将列中的列表转换为单独的列

In [370]: dval = pd.DataFrame(md[0].tolist(), )

In [371]: dval
Out[371]:
              0      1
0  hypertension   None
1          acne   None
2        cancer  lupus
现在,您可以使用
dval

In [372]: md = md.drop(0, axis=1)

In [373]: data_final = pd.concat([md, dval], axis=1)
然后,根据需要重命名这些列

In [374]: data_final.columns = ['medicine', 'disease_1', 'disease_2']

In [375]: data_final
Out[375]:
         medicine     disease_1 disease_2
0  fried tomatoes  hypertension      None
1       green tea          acne      None
2      meditation        cancer     lupus

我们可以假设在您的一般情况下,每种药物不超过2种疾病吗?情况是混合的,有些药物只有一种疾病,有些药物有几种疾病,比如说多达5种。我们可以假设在您的一般情况下,每种药物不超过2种疾病吗?情况是混合的,有些药物只有一种疾病,有些药物有几种疾病,这是我一直在寻找的最简单的答案。谢谢非常有用!谢谢你!这是我一直在寻找的最简单的答案。谢谢非常有用!谢谢你!