根据某些条件,将数据框一列中的所有行转换为多列

时间:2019-05-30 04:00:06

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

我想根据某些值/条件将一列数据转换为数据框中的多列。

请找到用于生成输入数据帧的代码

http request

数据如下图所示

enter image description here

请注意,我可能事先不知道列名。但通常遵循这种格式。我上面显示的是一个示例数据,实际数据可能有大约600-700列,并且以这种方式排列数据

我想做的是将以非数字(字符)开头的值转换为数据帧中的新列。它可以是一个新的数据框。

我试图编写一个for循环,但由于以下错误而失败。您能帮我实现这个目标吗?

{
    "key": "you key",
    "lang": "en-pt",
    "format": "plain",
    "text": "Life is like a game"
}

通过上述循环,我试图检查第一个字符是否为数字,如果是,则将其保留为值(例如:1、2、3等),以及是否是字符(例如:性别,种族)等等),然后创建一个新列。但这是不正确且冗长的方法

例如,在上面的示例中,列将为studyid,age_interview,Gender,Ethnicity。

最终输出看起来像这样

enter image description here

能否请您告诉我是否有一种优雅的方法?

2 个答案:

答案 0 :(得分:1)

使用itertools.groupby,然后构造pd.DataFrame

import pandas as pd
import itertools

l = ['studyid',1,'age_interview', 65,'Gender','1.Male',
                            '2.Female',
                            'Ethnicity','1.Chinese','2.Indian','3.Malay']
l = list(map(str, l))
grouped = [list(g) for k, g in itertools.groupby(l, key=lambda x:x[0].isnumeric())]
d = {k[0]: v for k,v in zip(grouped[::2],grouped[1::2])}

pd.DataFrame.from_dict(d, orient='index').T

输出:

     Gender studyid age_interview  Ethnicity
0    1.Male       1            65  1.Chinese
1  2.Female    None          None   2.Indian
2      None    None          None    3.Malay

答案 1 :(得分:1)

您可以使用groupby来执行以下操作:

m=~df1['VARIABLE'].str[0].str.isdigit().fillna(True)
new_df=(pd.DataFrame(df1.groupby(m.cumsum()).VARIABLE.apply(list).
                                    values.tolist()).set_index(0).T)
print(new_df.rename_axis(None,axis=1))

  studyid age_interview    Gender  Ethnicity
1       1            65    1.Male  1.Chinese
2    None          None  2.Female   2.Indian
3    None          None      None    3.Malay

说明m是一个帮助分隔组的帮助器系列:

print(m.cumsum())
0     1
1     1
2     2
3     2
4     3
5     3
6     3
7     4
8     4
9     4
10    4

然后我们将这个助手系列分组并应用列表:

df1.groupby(m.cumsum()).VARIABLE.apply(list)
VARIABLE
1                                 [studyid, 1]
2                          [age_interview, 65]
3                   [Gender, 1.Male, 2.Female]
4    [Ethnicity, 1.Chinese, 2.Indian, 3.Malay]
Name: VARIABLE, dtype: object

这时,我们将每个组作为一个列表,列名作为第一个条目。 因此,我们以此创建一个数据框,并将第一列设置为索引并转置以获得所需的输出。