Pandas数据框取消分组功能

时间:2015-07-29 19:16:39

标签: python-2.7 pandas dataframe

我有一个包含3列的数据框:

df1 = pd.DataFrame([[2, 2, 5, 7], [2, 5, 7.5, 10], [2, 5, 1, 3]]).T
df1.columns = ['col1', 'col2', 'col3']
df1

   col1  col2  col3
0     2   2.0     2
1     2   5.0     5
2     5   7.5     1
3     7  10.0     3

现在我想取消第3列的分组并使用新列col4获得更长的数据帧,如下面的df2所示:

df2 = pd.DataFrame([[2, 2, 2, 2, 2, 2, 2, 5, 7, 7, 7], [2, 2, 5, 5, 5, 5, 5, 7.5, 10, 10, 10], [2, 2, 5, 5, 5, 5, 5, 1, 3, 3, 3], [1, 2, 1, 2, 3, 4, 5, 1, 1, 2, 3]]).T

df2.columns = ['col1', 'col2', 'col3', 'col4']

df2

    col1  col2  col3  col4
0      2   2.0     2     1
1      2   2.0     2     2
2      2   5.0     5     1
3      2   5.0     5     2
4      2   5.0     5     3
5      2   5.0     5     4
6      2   5.0     5     5
7      5   7.5     1     1
8      7  10.0     3     1
9      7  10.0     3     2
10     7  10.0     3     3

2 个答案:

答案 0 :(得分:1)

以下是将groupbyreindex一起使用的一种方式。

# custom apply function
def func(group):
    return group.reset_index(drop=True).reindex(np.arange(group.col3)).fillna(method='ffill')
# groupby apply
result = df1.groupby(level=0).apply(func)


     col1  col2  col3
0 0     2   2.0     2
  1     2   2.0     2
1 0     2   5.0     5
  1     2   5.0     5
  2     2   5.0     5
  3     2   5.0     5
  4     2   5.0     5
2 0     5   7.5     1
3 0     7  10.0     3
  1     7  10.0     3
  2     7  10.0     3


result['col4'] = result.index.get_level_values(1) + 1
result.reset_index(drop=True)


    col1  col2  col3  col4
0      2   2.0     2     1
1      2   2.0     2     2
2      2   5.0     5     1
3      2   5.0     5     2
4      2   5.0     5     3
5      2   5.0     5     4
6      2   5.0     5     5
7      5   7.5     1     1
8      7  10.0     3     1
9      7  10.0     3     2
10     7  10.0     3     3

答案 1 :(得分:0)

您也可以使用numpy进行更快的计算:

import numpy as np
import pandas as pd

df = pd.DataFrame([[2, 2, 5, 7], [2, 5, 7.5, 10], [2, 5, 1, 3]]).T
df.columns = ['col1', 'col2', 'col3']

x = df.values
n = df.iloc[:,-1].astype(int).values

data = np.repeat(x,n,axis=0)
df1 = pd.DataFrame(data)
df1.loc[:,3] = n.repeat(n)
df1.columns = ['col1','col2','col3','col4']

print(df1)

礼物:

    col1  col2  col3  col4
0    2.0   2.0   2.0     2
1    2.0   2.0   2.0     2
2    2.0   5.0   5.0     5
3    2.0   5.0   5.0     5
4    2.0   5.0   5.0     5
5    2.0   5.0   5.0     5
6    2.0   5.0   5.0     5
7    5.0   7.5   1.0     1
8    7.0  10.0   3.0     3
9    7.0  10.0   3.0     3
10   7.0  10.0   3.0     3