如何在 python pandas 中重新构造它?合并,取消堆叠还是啥?
Posted
技术标签:
【中文标题】如何在 python pandas 中重新构造它?合并,取消堆叠还是啥?【英文标题】:How to re-structure this in python pandas? Merge, unstack or what?如何在 python pandas 中重新构造它?合并,取消堆叠还是什么? 【发布时间】:2021-07-11 11:12:49 【问题描述】:尝试用如下格式重新构建数据框:
key ref name value
0 k1 None N1 A
1 None k1 N2 B
2 None k1 N3 C
3 k2 None N4 D
4 k3 None N5 E
5 None k3 N6 F
6 None k3 N7 G
# In code
df = pd.DataFrame(columns=['key', 'ref', 'name', 'value'],
data=[
['k1',None,'N1','A'],
[None,'k1','N2','B'],
[None,'k1','N3','C'],
['k2',None,'N4','D'],
['k3',None,'N5','E'],
[None,'k3','N6','F'],
[None,'k3','N7','G']])
进入这个:
key ref name value name2 value2 name3 value3
0 k1 k1 N1 A N2 B N3 C
1 k2 None N4 D None None None None
2 k3 k3 N5 E N6 F N7 G
但正在努力做到正确。 'key' 和 'ref' 不是上面的索引,但如果这是解决方案的一部分,请随意详细说明如何以这种方式使用它们(源是这种格式的 Excel 文件)。目标是根据示例映射名称和值...(键和引用将被丢弃)
尝试了合并和堆栈,但无法正常工作...
注意以下规则:
“key”列中的键是唯一的(除非是 emtpy/None) 'ref' 列中的 Ref 最多有 2 个相同的值换句话说:
任何'key'都有0-2个对应的'ref' 任何 'ref' 匹配一个且只有一个对应的 'key'【问题讨论】:
【参考方案1】:也许这就是你需要的:
import pandas as pd
df = pd.DataFrame(
columns=["key", "ref", "name", "value"],
data=[
["k1", None, "N1", "A"],
[None, "k1", "N2", "B"],
[None, "k1", "N3", "C"],
["k2", None, "N4", "D"],
["k3", None, "N5", "E"],
[None, "k3", "N6", "F"],
[None, "k3", "N7", "G"],
],
)
print(df)
ind = df["key"].isna()
df1 = df.loc[~ind]
df2 = df.loc[ind]
combo = (
df1.merge(df2[["ref", "name", "value"]], left_on="key", right_on="ref", how="left")
.fillna("")
.groupby("key")
.agg(name=pd.NamedAgg("name_y", ":".join), value=pd.NamedAgg("value_y", ":".join))
)
for c in ["name", "value"]:
dx = combo[c].str.split(":", expand=True).add_prefix(c)
df1 = df1.merge(dx, left_on="key", right_index=True)
print(df1)
首先,我们根据key
列中是否有条目,将 df 拆分为两个单独的数据帧。
其次,我们创建一个组合数据框,将df1
与聚合的df2
合并,其中聚合为value
和name
创建两列,其中所有条目都连接成一个“:”-分隔字符串。
最后,我们使用str.split
和expand=True
将这些字符串拆分为单独的列,并将其与df1 合并。
key ref name value name0 name1 value0 value1
0 k1 None N1 A N2 N3 B C
3 k2 None N4 D None None
4 k3 None N5 E N6 N7 F G
None
条目还不太正确,但这很容易解决。
【讨论】:
以上是关于如何在 python pandas 中重新构造它?合并,取消堆叠还是啥?的主要内容,如果未能解决你的问题,请参考以下文章
python - 如何在Python中将pandas DataFrame与None进行比较?