如何在蟒蛇熊猫身上重建这种结构?合并、拆堆还是什么



试图用以下格式重新构建数据帧:

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"列中的引用最多为2个相同值

换句话说:

  • 任何"key"都有0-2个对应的"ref">
  • 任何"ref"都与一个且只有一个对应的"key"匹配

也许这就是您所需要的:

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)

首先,我们将df拆分为两个独立的数据帧,这取决于列key中是否有条目。

其次,我们创建一个组合数据帧,将df1与聚合的df2合并,其中聚合为valuename创建两列,其中所有条目都连接到一个":&quot-分开的字符串。

最后,我们使用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条目还不完全正确,但很容易修复。

最新更新