在pandas dataframe中将行分解为多行

时间:2016-10-04 13:12:07

标签: python pandas explode reshape melt

我有一个带有以下标题的数据框:

id, type1, ..., type10, location1, ..., location10

我希望将其转换如下:

id, type, location 

我设法使用嵌入式for循环来做到这一点,但它很慢:

new_format_columns = ['ID', 'type', 'location'] 
new_format_dataframe = pd.DataFrame(columns=new_format_columns)



print(data.head())
new_index = 0 
for index, row in data.iterrows(): 
        ID = row["ID"]

        for i in range(1,11):
                if row["type"+str(i)] == np.nan:
                        continue
                else:
                        new_row = pd.Series([ID, row["type"+str(i)], row["location"+str(i)]])
                        new_format_dataframe.loc[new_index] = new_row.values
                        new_index += 1

使用原生熊猫功能的任何改进建议?

1 个答案:

答案 0 :(得分:4)

您可以使用lreshape

types = [col for col in df.columns if col.startswith('type')]
location = [col for col in df.columns if col.startswith('location')]

print(pd.lreshape(df, {'Type':types, 'Location':location}, dropna=False))

样品:

import pandas as pd

df = pd.DataFrame({
'type1': {0: 1, 1: 4}, 
'id': {0: 'a', 1: 'a'}, 
'type10': {0: 1, 1: 8},
'location1': {0: 2, 1: 9},
'location10': {0: 5, 1: 7}})

print (df)
  id  location1  location10  type1  type10
0  a          2           5      1       1
1  a          9           7      4       8

types = [col for col in df.columns if col.startswith('type')]
location = [col for col in df.columns if col.startswith('location')]

print(pd.lreshape(df, {'Type':types, 'Location':location}, dropna=False))
  id  Location  Type
0  a         2     1
1  a         9     4
2  a         5     1
3  a         7     8

另一个双melt的解决方案:

print (pd.concat([pd.melt(df, id_vars='id', value_vars=types, value_name='type'),
                  pd.melt(df, value_vars=location, value_name='Location')], axis=1)
         .drop('variable', axis=1))

  id  type  Location
0  a     1         2
1  a     4         9
2  a     1         5
3  a     8         7

编辑:

lreshape现在没有记录,但将来可能会删除(with pd.wide_to_long too)。

可能的解决方案是将所有3个函数合并为一个 - 也许melt,但现在它没有实现。也许在一些新版本的熊猫中。然后我的答案会更新。

相关问题