如何在熊猫数据中平整每n行

时间:2019-10-22 23:17:12

标签: python pandas dataframe

我想将熊猫数据框中的每n行放平,例如,如果n=2,则示例如下

df = pd.DataFrame([[1,2], [3,4], [5,6], [7,8], [9,10], [11,12]])
df.columns = ['a', 'b']
target_df =  pd.DataFrame([[1,2, 3, 4], [5,6, 7, 8], [9,10, 11, 12]])
target_df.columns = ['a1', 'b1', 'a2', 'b2']
print(df, '\n\n', target_df)

    a   b
0   1   2
1   3   4
2   5   6
3   7   8
4   9  10
5  11  12 

    a1  b1  a2  b2
0   1   2   3   4
1   5   6   7   8
2   9  10  11  12

有什么快速的方法可以做到吗?请注意,数据帧和n的长度可以任意大,因此硬编码n并不是一个好的选择。

4 个答案:

答案 0 :(得分:1)

首先我们得到所有偶数和不均匀的索引号。然后我们用locconcataxis=1上选择它们:

grp1 = df.index%2 == 0 # uneven index
grp2  = df.index%2 == 1 # even index

df = pd.concat([
    df.loc[grp1].reset_index(drop=True), df.loc[grp2].reset_index(drop=True)
], axis=1)

   a   b   a   b
0  1   2   3   4
1  5   6   7   8
2  9  10  11  12

答案 1 :(得分:1)

您可以使用numpy hstack

简单的解决方案:

n = 2
np.hstack((df.values[::n],df.values[1::n]))

array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

使用,将以上内容转换为数据框,

n = 2
pd.DataFrame(np.hstack((df.values[::n],df.values[1::n])))

    0   1   2   3
0   1   2   3   4
1   5   6   7   8
2   9   10  11  12

如果要处理变量n,请尝试

n = 3
l = []
for i in range(n):
    l.append(df.values[i::n])

pd.DataFrame(np.hstack((l)))

注意:这仍然要求n是len(df)的因数

答案 2 :(得分:0)

构造多索引并分配给索引和alter table Foo add name varchar2(30)

unstack

如果您不希望使用多索引列,可以将其展平

n = 2
iix = pd.MultiIndex.from_arrays([np.arange(df.shape[0]) // n, 
                                (np.arange(df.shape[0]) % n)+1])

df1 = df.set_index(iix).unstack().sort_index(level=1, axis=1)

Out[211]:
   a   b   a   b
   1   1   2   2
0  1   2   3   4
1  5   6   7   8
2  9  10  11  12

如果您要使用其他df1.columns = df1.columns.map('{0[0]}{0[1]}'.format) Out[213]: a1 b1 a2 b2 0 1 2 3 4 1 5 6 7 8 2 9 10 11 12 ,请更改n的值

n

答案 3 :(得分:0)

只需直接使用基础的numpy数组:

import pandas as pd

df = pd.DataFrame(
    [[1,2], [3,4], [5,6], [7,8], [9,10], [11,12]],
    columns=["a", "b"]
)
df_2 = pd.DataFrame(
    df.values.reshape([-1, 4]),
    columns = ["a1", "b1", "a2", "b2"]
)

df如下:

    a   b
0   1   2
1   3   4
2   5   6
3   7   8
4   9  10
5  11  12

df_2看起来像:

   a1  b1  a2  b2
0   1   2   3   4
1   5   6   7   8
2   9  10  11  12

对于通用解决方案:

def concat_rows(df, n):
    new_cols = [
        f"{col}{i}"
        for i in range(1, n+1)
        for col in df.columns
    ]
    n_cols = len(df.columns)
    new_df = pd.DataFrame(
        df.values.reshape([-1, n_cols*n]),
        columns=new_cols
    )
    return new_df

df_2 = concat_rows(df, 2)
df_3 = concat_rows(df, 3)

df_2与以前一样。 df_3看起来像:

   a1  b1  a2  b2  a3  b3
0   1   2   3   4   5   6
1   7   8   9  10  11  12