我有数据框和数据透视表,我需要在pivot_table的列中替换数据框中的一些值。
数据帧:
access_code ID cat1 cat2 cat3
g1gw8bzwelo83mhb 0433a3d29339a4b295b486e85874ec66 1 2
g0dgzfg4wpo3jytg 04467d3ae60fed134077a26ae33e0eae 1 2
g1gwui6r2ep471ht 06e3395c0b64a3168fbeab6a50cd8f18 1 2
g05ooypre5l87jkd 089c81ebeff5184e6563c90115186325 1
g0ifck11dix7avgu 0d254a81dca0ff716753b67a50c41fd7 1 2 3
数据透视表:
type 1 2 \
access_code ID member_id
g1gw8bzwelo83mhb 0433a3d29339a4b295b486e85874ec66 1045794 1023 923 1 122
g05ooypre5l87jkd 089c81ebeff5184e6563c90115186325 768656 203 243 1 169
g1gwui6r2ep471ht 06e3395c0b64a3168fbeab6a50cd8f18 604095 392 919 1 35
g06q0itlmkqmz5cv f4a3b3f2fca77c443cd4286a4c91eedc 1457307 243 1
g074qx58cmuc1a2f 13f2674f6d5abc888d416ea6049b57b9 5637836 1
g0dgzfg4wpo3jytg 04467d3ae60fed134077a26ae33e0eae 5732738 111 2343 1
欲望输出:
access_code ID cat1 cat2 cat3
g1gw8bzwelo83mhb 0433a3d29339a4b295b486e85874ec66 1023 923
g0dgzfg4wpo3jytg 04467d3ae60fed134077a26ae33e0eae 111 2343
g1gwui6r2ep471ht 06e3395c0b64a3168fbeab6a50cd8f18 392 919
g05ooypre5l87jkd 089c81ebeff5184e6563c90115186325 1
g0ifck11dix7avgu 0d254a81dca0ff716753b67a50c41fd7 1 2 3
如果我使用
df.ix[df.cat1 == 1] = pivot_table['1']
它返回错误ValueError: cannot set using a list-like indexer with a different length than the value
答案 0 :(得分:0)
只要您的数据框架不是很大,您就可以以一些非常丑陋的方式实现它。我相信其他人会为您提供更优雅的解决方案,但与此同时,此胶带可能会指向您正确的方向。
请记住,在这种情况下,我使用2个数据帧而不是1个数据帧和1个数据透视表执行此操作,因为我已经在从文本数据格式化数据帧时遇到了足够的麻烦。
由于您的数据中有空字段且我的数据框架不喜欢这样,因此首先将空字段转换为零。
df = df.replace(r'\s+', 0, regex=True)
现在确保您的数据实际上是浮动的,否则比较将失败
df[['cat1', 'cat2', 'cat3']] = df[['cat1', 'cat2', 'cat3']].astype(float)
对于烟火爆竹:
df.cat1.loc[df.cat1 == 1] = piv['1'].loc[df.loc[df.cat1 == 1].index].dropna()
df.cat1 = df.cat1.fillna(1)
df.cat2.loc[df.cat2 == 2] = piv['2'].loc[df.loc[df.cat2 == 2].index].dropna()
df.cat2 = df.cat2.fillna(2)
df = df.replace(0, ' ')
fillna只是为了重新创建你想要的输出,你显然还没有处理过某些行。我想这个逐列的NaN填充不会在你的实际使用中发生。