我想将熊猫数据框中的每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
并不是一个好的选择。
答案 0 :(得分:1)
首先我们得到所有偶数和不均匀的索引号。然后我们用loc
和concat
在axis=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