gpt4 book ai didi

python - 具有自定义列的 pandas 枢轴

转载 作者:行者123 更新时间:2023-12-01 09:07:30 30 4
gpt4 key购买 nike

我有一个数据帧,其中有几个变量(此处为 Var1Var2),这些变量在不同位置(此处为 Station)是不同的。然后我有一定数量的案例,对于每个案例,我在每个位置都会得到不同的值。

例如:

np.random.seed(42)

df1 = pd.DataFrame({'Station' : range(10)})
df1['ID'] = 'a'
df1['Var1'] = np.random.randn(10)
df1['Var2'] = np.random.randn(10)

df2 = pd.DataFrame({'Station' : range(10)})
df2['ID'] = 'b'
df2['Var1'] = np.random.randn(10)
df2['Var2'] = np.random.randn(10)

df = pd.concat([df1, df2])

所以它看起来像这样:

   Station ID      Var1      Var2
0 0 a 0.496714 -0.463418
1 1 a -0.138264 -0.465730
2 2 a 0.647689 0.241962
3 3 a 1.523030 -1.913280
4 4 a -0.234153 -1.724918
5 5 a -0.234137 -0.562288
6 6 a 1.579213 -1.012831
7 7 a 0.767435 0.314247
8 8 a -0.469474 -0.908024
9 9 a 0.542560 -1.412304
0 0 b 1.465649 -0.601707
1 1 b -0.225776 1.852278
2 2 b 0.067528 -0.013497
3 3 b -1.424748 -1.057711
4 4 b -0.544383 0.822545
5 5 b 0.110923 -1.220844
6 6 b -1.150994 0.208864
7 7 b 0.375698 -1.959670
8 8 b -0.600639 -1.328186
9 9 b -0.291694 0.196861

我的实际数据有 6 个不同的变量、45 个站点和超过 22,000 个 ID。

我现在想要以这样的方式转换数据帧:每个站的每个变量都有一列,并将 ID 作为索引。所以我想得到这个:

      Var1_0    Var1_1    Var1_2    ...       Var2_7    Var2_8    Var2_9
ID ...
a 0.496714 -0.138264 0.647689 ... 0.314247 -0.908024 -1.412304
b 1.465649 -0.225776 0.067528 ... -1.959670 -1.328186 0.196861

我尝试过这个:

def test_func(x, IQ):
col = IQ + '_' + str(x['Station'])
out = {col: x[IQ]}
return pd.Series(out)

def transformIQ(df, IQs):
for i, iq in enumerate(IQs):
if i==0:
df_new = df.apply(lambda x: test_func(x, iq), axis=1)
else:
df_tmp = df.apply(lambda x: test_func(x, iq), axis=1)
df_new = pd.concat([df_new, df_tmp], axis=1)

return df_new

IQs = ['Var1', 'Var2']
df3 = transformIQ(df, IQs)

df4 = pd.concat([df, df3], axis=1)

dfpivot = df4.pivot_table(index='ID').drop(['Station', 'Var1', 'Var2'], axis=1)

这为我提供了我想要的数据框,但正如我之前所说,我的实际数据超过 1,000,000 行,这种方法不起作用。有没有更好/更简单的方法可以处理超过 1,000,000 行?

最佳答案

使用stackunstack :

df = df.set_index(['ID','Station']).stack().unstack([2,1]).sort_index(axis=1)
#flatten columns, 3.6+
df.columns = [f'{i}_{j}' for i, j in df.columns]
#bellow 3.6
#df.columns = ['{}_{}'.format(i, j) for i, j in df.columns]
print (df)
Var1_0 Var1_1 Var1_2 Var1_3 Var1_4 Var1_5 Var1_6 \
ID
a 0.496714 -0.138264 0.647689 1.523030 -0.234153 -0.234137 1.579213
b 1.465649 -0.225776 0.067528 -1.424748 -0.544383 0.110923 -1.150994

Var1_7 Var1_8 Var1_9 Var2_0 Var2_1 Var2_2 Var2_3 \
ID
a 0.767435 -0.469474 0.542560 -0.463418 -0.465730 0.241962 -1.913280
b 0.375698 -0.600639 -0.291694 -0.601707 1.852278 -0.013497 -1.057711

Var2_4 Var2_5 Var2_6 Var2_7 Var2_8 Var2_9
ID
a -1.724918 -0.562288 -1.012831 0.314247 -0.908024 -1.412304
b 0.822545 -1.220844 0.208864 -1.959670 -1.328186 0.196861

关于python - 具有自定义列的 pandas 枢轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51931775/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com