gpt4 book ai didi

python - 加入列并在行中 reshape

转载 作者:太空宇宙 更新时间:2023-11-04 09:24:37 25 4
gpt4 key购买 nike

我有这样的数据:

data = {'Host' : ['A','A','A','A','A','A','B','B','B'], 'Duration' : ['1','2',None,'4','5',None,'7','8',None], 'Predict' : [None,None,'3',None,None,'6',None,None,'9']}
df = pd.DataFrame(data)

看起来像:


Host Duration Predict
0 A 1 None
1 A 2 None
2 A None 3
3 A 4 None
4 A 5 None
5 A None 6
6 B 7 None
7 B 8 None
8 B None 9

我期望得到的:

A   1, 2, 3
A 4, 5, 6
B 7, 8, 9

我得到了我想要的,但我决定不喜欢的方式:

def create_vector(group):
result = []
df_array = []
for index, item in enumerate(group.Duration.ravel()):
if (item != None):
result.append(item)
else:
result.append(group.Predict.ravel()[index])
result.append(-1)
result = np.array(list(map(int, result)))
splitted = np.split(result, np.where(result == -1)[0] + 1)
for arr in splitted:
if (len(arr) > 3):
seq = ', '.join(str(e) for e in arr[:-1])
df_array.append(seq)
return pd.DataFrame(df_array,columns=['seq'])

arr 的最小长度必须是一个“Duration”加一个“Predict”

df= df.groupby(['host']).apply(create_vector)
df= df.reset_index().rename(columns={'level_1':'Index'})
df= df.drop(columns = {'Index'})

想用 Pandas 解决这个问题。等待意见和建议

最佳答案

我相信您可以通过 Predict 列替换 Duration 中的缺失值,因此解决方案很简单:

df['new'] = df['Duration'].fillna(df['Predict']).astype(str)

如果需要按 Host 组对每 3 个值进行分组:

g = df.groupby('Host').cumcount() // 3

或者如果需要按 Predict 列和 None 分隔符进行分组 - 只需要默认索引:

g = df.index.where(df['Predict'].notna()).to_series().bfill()

#if always unique values in Predic column
#g = df['Predict'].bfill()

df = (df.groupby(['Host', g])['new']
.apply(', '.join)
.reset_index(level=1, drop=True)
.reset_index(name='Seq'))
print (df)
Host Seq
0 A 1, 2, 3
1 A 4, 5, 6
2 B 7, 8, 9

通过 DataFrame.stack reshape 的另一种解决方案- 默认情况下,None 或缺失值会再次聚合 join:

g = df.groupby('Host').cumcount() // 3

df = (df.set_index(['Host', g])
.stack()
.astype(str)
.groupby(level=[0,1])
.apply(', '.join)
.reset_index(level=1, drop=True)
.reset_index(name='Seq')
)
print (df)
Host Seq
0 A 1, 2, 3
1 A 4, 5, 6
2 B 7, 8, 9

关于python - 加入列并在行中 reshape ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58428518/

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