我正在尝试创建一个函数来遍历dataframe中的每一行,以查找匹配项,然后在同一行中追加这些匹配项,将数据从长格式更改为宽格式。我还没有在df.pivot上取得成功,这是我的直觉,所以我需要尝试其他的东西。
for x in df.itertuples():
for y in df.itertuples():
if x.MDS==y.MDS:
这是我的嵌套for循环,用于识别所有匹配项。
pd.Dataframe=({'MDS': {106: 2, 107: 10, 108: 100, 109: 500, 110: 2}, 'LSR': {106: '3-4', 107: '3-4', 108: '3-4', 109: '3-4', 110: '3-6'}, 'Small State Wins': {106: 4150, 107: 5210, 108: 5405, 109: 5625, 110: 3893}})
这是我的示例dataframe,或者仅仅是它的快照。我希望在MDS列中找到匹配项,当有匹配时,将该观察结果放入与原始匹配对应的新列中。
MDS LSR Small State Wins Match1MDS Match1LSR Match1Small State Wins
2 3-4 4150 2 3-6 4150
10 3-4 5210 NaN NaN NaN
100 3-4 5405 NaN NaN NaN
500 3-4 5625 NaN NaN NaN
2 3-6 3893 2 3-4 3893
像这样的数据就是我想要的结果。我更倾向于忽略a到a匹配,因为我不希望行0与行0匹配并记录在新列中。如果没有找到匹配,我希望有一个空白或没有观察,如果在MDS列下有3个匹配的观察,我希望它们也以宽格式附加,在match2名称下,等等。运行时不是一个问题,因为数据集相对较小,低于10,000,所以我可以使用嵌套循环,但我真的坚持要移动数据。
谢谢!
发布于 2021-12-26 07:23:50
我想这就是你要找的东西。
df['group_count'] = df.groupby(
'MDS',
group_keys=False,
)['MDS'].expanding().count().reset_index(
level=0,
drop=True,
)
df = df.set_index(['MDS', 'group_count']).unstack()
df.columns = df.columns.swaplevel(0, 1)
df = df.sort_index(axis=1)
https://stackoverflow.com/questions/70484514
复制相似问题