试图用以下格式重新构建数据帧:
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
合并,其中聚合为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
条目还不完全正确,但很容易修复。