假设我有一个简单的数据框架,其中有四个特性,即食物、厨房、城市和细节.

d = {'Food': ['P1|0', 'P2', 'P3|45', 'P1', 'P2', 'P4', 'P1|1', 'P3|7', 'P5', 'P1||23'], 
     'Kitchen' : ['L1', 'L2','L9', 'L4','L5', 'L6','L1', 'L9','L10', 'L1'],
     'City': ['A', 'A', 'A', 'B', 'B','B', 'C', 'C', 'C','D'],
     'Detail': ['d1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9','d0']}
df = pd.DataFrame(data=d)

我的目标是使用不含|的食品价值子串,并创建一个新的数据框架,在其中我可以看到哪些厨房生产类似的食品.我定义相似性的方式是子字符串应该与厨房匹配.

df['Food'] = df['Food'].apply(str)

df.insert(0,'subFood',df['Food'].str.split('|').str[0])
df.iloc[: , :2]
subFood Food
0   P1  P1|0    
1   P2  P2  
2   P3  P3|45   
3   P1  P1  
4   P2  P2  
5   P4  P4  
6   P1  P1|1    
7   P3  P3|7    
8   P5  P5  
9   P1  P1||23  

为此,我使用了merge函数和query函数.

df.merge(df, on=['subFood', 'Kitchen'], suffixes=('_1', '_2')).query('City_1 != City_2')

subFood Food_1  Kitchen City_1  Detail_1    Food_2  City_2  Detail_2
1   P1  P1|0    L1  A   d1  P1|1    C   d7
2   P1  P1|0    L1  A   d1  P1||23  D   d0
3   P1  P1|1    L1  C   d7  P1|0    A   d1
5   P1  P1|1    L1  C   d7  P1||23  D   d0
6   P1  P1||23  L1  D   d0  P1|0    A   d1
7   P1  P1||23  L1  D   d0  P1|1    C   d7
11  P3  P3|45   L9  A   d3  P3|7    C   d8
12  P3  P3|7    L9  C   d8  P3|45   A   d3

我被困在这里了.我的意图是创建一个看起来应该类似于下面所示的数据帧的数据帧.我感谢任何帮助和/或提示.

subFood Food_1  Food_2 Kitchen City Detail
P1       P1|0    P1|0    L1       A   d1
P1       P1|0    P1|1    L1       C   d1  
....

推荐答案

IIUC,通过将城市名称组合到列表中,然后使用explode,可以将每行拆分为两行:

merged = df.merge(df, on=["subFood","Kitchen"], suffixes=("_1","_2")).query("City_1 != City_2")
merged["City"] = merged[["City_1","City_2"]].to_numpy().tolist()
output = merged.drop(["City_1","City_2","Detail_2"],axis=1).explode("City").rename(columns={"Detail_1":"Detail"})

>>> output
   subFood  Food_1 Kitchen Detail  Food_2 City
1       P1    P1|0      L1     d1    P1|1    A
1       P1    P1|0      L1     d1    P1|1    C
2       P1    P1|0      L1     d1  P1||23    A
2       P1    P1|0      L1     d1  P1||23    D
3       P1    P1|1      L1     d7    P1|0    C
3       P1    P1|1      L1     d7    P1|0    A
5       P1    P1|1      L1     d7  P1||23    C
5       P1    P1|1      L1     d7  P1||23    D
6       P1  P1||23      L1     d0    P1|0    D
6       P1  P1||23      L1     d0    P1|0    A
7       P1  P1||23      L1     d0    P1|1    D
7       P1  P1||23      L1     d0    P1|1    C
11      P3   P3|45      L9     d3    P3|7    A
11      P3   P3|45      L9     d3    P3|7    C
12      P3    P3|7      L9     d8   P3|45    C
12      P3    P3|7      L9     d8   P3|45    A

Python相关问答推荐

为什么Python内存中的列表大小与文档不匹配?

如何合并具有相同元素的 torch 矩阵的行?

在Python中控制列表中的数据步长

在极点中读取、扫描和接收有什么不同?

Python将一个列值分割成多个列,并保持其余列相同

numpy数组和数组标量之间的不同行为

PYTHON中的pd.wide_to_long比较慢

随机森林n_估计器的计算

如何通过函数的强式路径动态导入函数?

如何计算Pandas 中具有特定条件的行之间的天差

条件Python Polars cum_sum over a group,有更好的方法吗?

在极坐标中添加列总计行

查找一个数据帧中另一个数据帧的值的索引

自由空间里的激光...以及我如何才能检测到Line以进行进一步计算?

Cdlib和iggraph的信息变化结果不同

在matplotlib中将标题的一部分设置为粗体和正常

在Pandas 数据帧中使用GROUPBY()应用FIND_PEAKS()函数

是否有与字节文字等价的函数?

生成所有排列:为什么在递归中产生的值不在输出中?

棋类游戏的极大极小函数