如何将列转换为行?

时间:2019-08-20 01:42:09

标签: python-3.x pandas numpy dataframe analytics

假设我有两行,其中大多数列的值都相同,但并非全部相同。我想将这两行分组为值相同的地方,如果值不同,则创建一个额外的列并将该列的名称指定为“ column1”

第1步:这里假设我的行'a','b','c'中的列均具有相同的值,而值'd','e','f'中的列均具有相同的值,所以我我使用'a','b','c'进行分组,然后拆开'd','e','f'

步骤2:然后我放下级别,然后将其重命名为'a','b','c','d','d1','e','e1','f','f1 '

但是在我的实际情况中,我有500多个列和一百万行,我不知道如何将其扩展到500多个列 1)我不知道哪些所有列将具有相同的值 2)哪些所有列将具有不同的值,在与具有相同值的列进行分组之后需要将其转换为新列

df.groupby(['a','b','c']) ['d','e','f'].apply(lambda x:pd.DataFrame(x.values)).unstack().reset_index()

df.columns = df.columns.droplevel()
df.columns = ['a','b','c','d','d1','e','e1','f','f1']

enter image description here

更清楚地说,以下代码创建示例数据框和预期输出

df = pd.DataFrame({'Cust_id':[100,100, 101,101,102,103,104,104], 'gender':['M', 'M', 'F','F','M','F','F','F'], 'Date':['01/01/2019', '02/01/2019','01/01/2019',
                                                                                                                   '01/01/2019','03/01/2019','04/01/2019','03/01/2019','03/01/2019'],
              'Product': ['a','a','b','c','d','d', 'e','e']})



expected_output = pd.DataFrame({'Cust_id':[100, 101,102,103,104], 'gender':['M', 'F','M','F','F'], 'Date':['01/01/2019','01/01/2019','03/01/2019','04/01/2019', '03/01/2019'], 'Date1': ['02/01/2019', 'NA','NA','NA','NA']
                                  , 'Product': ['a', 'b', 'd', 'd','e'], 'Product1':['NA', 'c','NA','NA','NA' ]})

2 个答案:

答案 0 :(得分:1)

您可以按照以下步骤从expected_output中获取df

s = df.groupby('Cust_id').cumcount().astype(str).replace('0', '')
df1 = df.pivot_table(index=['Cust_id', 'gender'], columns=s, values=['Date', 'Product'], aggfunc='first')
df1.columns = df1.columns.map(''.join)

Out[57]:
                      Date       Date1 Product Product1
Cust_id gender
100     M       01/01/2019  02/01/2019       a        a
101     F       01/01/2019  01/01/2019       b        c
102     M       03/01/2019         NaN       d      NaN
103     F       04/01/2019         NaN       d      NaN
104     F       03/01/2019  03/01/2019       e        e

下一步,将具有重复值的列替换为NA

df_expected = df1.where(df1.ne(df1.shift(axis=1)), 'NA').reset_index()

Out[72]:
   Cust_id gender        Date       Date1 Product Product1
0      100      M  01/01/2019  02/01/2019       a       NA
1      101      F  01/01/2019          NA       b        c
2      102      M  03/01/2019          NA       d       NA
3      103      F  04/01/2019          NA       d       NA
4      104      F  03/01/2019          NA       e       NA

答案 1 :(得分:0)

您可以尝试使用此代码-可能会更清洁一些,但我认为它可以完成工作


df = pd.DataFrame({'a':[100, 100], 'b':['tue', 'tue'], 'c':['yes', 'yes'], 
                   'd':['ok', 'not ok'], 'e':['ok', 'maybe'], 'f':[55, 66]})

df_transformed = pd.DataFrame()

for column in df.columns:
    col_vals = df.groupby(column)['b'].count().index.values
    for ix, col_val in enumerate(col_vals):
        temp_df = pd.DataFrame({column + str(ix) : [col_val]})
        df_transformed = pd.concat([df_transformed, temp_df], axis = 1)

Output for df_transformed