如何在pandas中合并具有相似数据的行

3
我有一份数据,包含三列:startpoint(起始点),endpoint(结束点)和data(数据)。
如果起始点和结束点包含相同的数据(双向),我想要合并这些行,并添加额外的列。例如,从以下表格开始:
startpoint endpoint data
A B 1
C D 2
B A 3
D C 4
则变成以下表格:
startpoint endpoint data_1 data_2
A B 1 3
C D 2 4
有没有快速的方法在 pandas 上做到这一点?
感谢。
4个回答

3

首先,我们按照startpoint和endpoint排序的索引进行分组,以确保我们得到匹配的排列组合。

match_groups = ['_'.join(sorted(t)) for t in zip(df['startpoint'],df['endpoint'])]
df2 = df.groupby(match_groups, as_index = False).agg({'startpoint':'first', 'endpoint':'first', 'data':list})

df2 的样子如下:

    startpoint    endpoint    data
--  ------------  ----------  ------
 0  A             B           [1, 3]
 1  C             D           [2, 4]

如果我们想要将data拆分到不同的列中,那么我们可以使用apply函数,并将其应用于pd.Series(并重新命名列名以获得所需的标签)。
(df2.set_index(['startpoint', 'endpoint'])['data']
    .apply(pd.Series).rename(columns = lambda n:f'data_{n+1}')
    .reset_index()
)

输出:

    startpoint    endpoint      data_1    data_2
--  ------------  ----------  --------  --------
 0  A             B                  1         3
 1  C             D                  2         4

谢谢,那对我有用! - PotatoInt

1
如果我正确理解了您的问题,下面的代码应该可以实现您想要的功能 -
data.index = [hash(frozenset([x,y])) for x, y in zip(data["startpoint"], data["endpoint"])]
result = data.groupby(data.index)["data"].apply(list).to_frame()
result = result["data"].apply(pd.Series)
result.columns = ["data1", "data2"]
result = pd.merge(data[["startpoint", "endpoint"]], result, left_index=True, right_index=True)
result = result[~result.index.duplicated(keep='first')]

变量data是原始数据框架。如果有任何不清楚的地方,请告诉我。

0

获取起始点和终点之间的匹配值,并根据您的数据类型进行必要的转换。然后可以对数据帧中的值进行排序并使用 groupby

# Matching values between startpoint + endpoint
df['start_end_grouped'] = [sorted(''.join(val).replace(',','')) for val in zip(df['startpoint'], df['endpoint'])]

# Conversions
df['data'] = df['data'].str.replace(',','').astype(float)
df['start_end_grouped'] = df['start_end_grouped'].astype(str)

# Result

df[['data','start_end_grouped']].sort_values(by=['start_end_grouped','data'])\
    .groupby('start_end_grouped',as_index=False).agg(list)

  start_end_grouped        data
0        ['A', 'B']  [1.0, 3.0]
1        ['C', 'D']  [2.0, 4.0]

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接