如何在 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 合并,其中聚合为valuename 创建两列,其中所有条目都连接成一个“:”-分隔字符串。

最后,我们使用str.splitexpand=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进行比较?

python - 如何按python中的因子级别对pandas数据框中的行进行重新排序?

Pandas DataFrame构造简析

pandas索引的设置与修改

python 数据分析--数据处理工具Pandas

如何构造一个使用 Python 中其他包中的函数的函数?