gpt4 book ai didi

python - 复杂的(对我来说)在 Pandas 中从宽到长 reshape

转载 作者:太空狗 更新时间:2023-10-29 22:16:14 26 4
gpt4 key购买 nike

个人(索引从 0 到 5)在两个位置之间进行选择:A 和 B。我的数据具有广泛的格式,其中包含因人而异的特征 (ind_var) 和仅因位置而异的特征 (location_var)。

例如,我有:

In [281]:

df_reshape_test = pd.DataFrame( {'location' : ['A', 'A', 'A', 'B', 'B', 'B'], 'dist_to_A' : [0, 0, 0, 50, 50, 50], 'dist_to_B' : [50, 50, 50, 0, 0, 0], 'location_var': [10, 10, 10, 14, 14, 14], 'ind_var': [3, 8, 10, 1, 3, 4]})

df_reshape_test

Out[281]:
dist_to_A dist_to_B ind_var location location_var
0 0 50 3 A 10
1 0 50 8 A 10
2 0 50 10 A 10
3 50 0 1 B 14
4 50 0 3 B 14
5 50 0 4 B 14

变量“位置”是由个人选择的。dist_to_A 是从个人选择的位置到位置 A 的距离(与 dist_to_B 相同)

我希望我的数据具有这种形式:

    choice  dist_S  ind_var location    location_var
0 1 0 3 A 10
0 0 50 3 B 14
1 1 0 8 A 10
1 0 50 8 B 14
2 1 0 10 A 10
2 0 50 10 B 14
3 0 50 1 A 10
3 1 0 1 B 14
4 0 50 3 A 10
4 1 0 3 B 14
5 0 50 4 A 10
5 1 0 4 B 14

其中 choice == 1 表示个人已选择该位置,dist_S 是距所选位置的距离。

我读到了 .stack方法,但无法弄清楚如何将其应用于这种情况。感谢您的宝贵时间!

注意:这只是一个简单的例子。我正在查看的数据集具有不同数量的位置和每个位置的个人数量,因此我正在寻找一个尽可能灵活的解决方案

最佳答案

其实pandas有一个wide_to_long命令可以很方便的做你想做的事情。

df = pd.DataFrame( {'location' : ['A', 'A', 'A', 'B', 'B', 'B'], 
'dist_to_A' : [0, 0, 0, 50, 50, 50],
'dist_to_B' : [50, 50, 50, 0, 0, 0],
'location_var': [10, 10, 10, 14, 14, 14],
'ind_var': [3, 8, 10, 1, 3, 4]})

df['ind'] = df.index

#The `location` and `location_var` corresponds to the choices,
#record them as dictionaries and drop them
#(Just realized you had a cleaner way, copied from yous).

ind_to_loc = dict(df['location'])
loc_dict = dict(df.groupby('location').agg(lambda x : int(np.mean(x)))['location_var'])
df.drop(['location_var', 'location'], axis = 1, inplace = True)
# now reshape
df_long = pd.wide_to_long(df, ['dist_to_'], i = 'ind', j = 'location')

# use the dictionaries to get variables `choice` and `location_var` back.

df_long['choice'] = df_long.index.map(lambda x: ind_to_loc[x[0]])
df_long['location_var'] = df_long.index.map(lambda x : loc_dict[x[1]])
print df_long.sort()

这会为您提供所需的表格:

              ind_var  dist_to_ choice  location_var
ind location
0 A 3 0 A 10
B 3 50 A 14
1 A 8 0 A 10
B 8 50 A 14
2 A 10 0 A 10
B 10 50 A 14
3 A 1 50 B 10
B 1 0 B 14
4 A 3 50 B 10
B 3 0 B 14
5 A 4 50 B 10
B 4 0 B 14

当然,如果您想要的话,您可以生成一个采用 01 的选择变量。

关于python - 复杂的(对我来说)在 Pandas 中从宽到长 reshape ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17688155/

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