gpt4 book ai didi

python - 如何正确迭代两列并弹出数据与新 df 匹配的行

转载 作者:行者123 更新时间:2023-12-01 07:39:38 26 4
gpt4 key购买 nike

我有一个包含两列的数据框,我希望对其进行迭代。这个想法是找到该项目出现的任何行(在任一列中),然后将该行移动到单独的数据帧。下面的例子,言语很难。

df1:

fname lname fnameNum lnameNum fnameWeight lnameWeight fname+num lname+num
A B 1 1 25 35 A,1 B,1
X Z 3 9 2 17 X,3 Z,9
N M 8 7 14 15 N,14 M,15
B A 1 1 35 25 B,1 A,1

我们的想法是执行以下操作:

获取第一行,并将其复制到新的数据框

df2:

fname lname fnameNum lnameNum fnameWeight lnameWeight fname+num lname+num group
A B 1 1 25 35 A,1 B,1 1

然后,获取 fname+num 的值并查看 df1 中的哪些行包含完全匹配,同时搜索 fname+numlname+num .

一旦匹配完成并且所有行都被复制,我希望将它们从 df1 中删除。这使得 df2 像这样:

fname lname fnameNum lnameNum fnameWeight lnameWeight fname+num lname+num group
A B 1 1 25 35 A,1 B,1 1
B A 1 1 35 25 B,1 A,1 1

df1 如下所示:

fname lname fnameNum lnameNum fnameWeight lnameWeight fname+num lname+num
X Z 3 9 2 17 X,3 Z,9
N M 8 7 14 15 N,14 M,15

我的目标是对 df1 的第一个元素再次执行相同的操作,并继续这样做,直到 df1 实际上为空。

我为尝试解决此问题而编写的方法:

df2.iloc[len(df2)] = df1.iloc[0, :] #get the first row of df1, copy to df2
for row in df1.iterrows():
for row in df2.iterrows():
if df2['fname+num'].isin((df1['fname+num' or df1['lname+num'])):
df2.loc[len(df2)] = df1.iloc[row]#if there is a match between the df2['fname+num'][0] and any element of any row in df1['fname+num' | 'lname+num'] then copy that entire row from df1 to df2

未显示* 删除 df1 中存在于 df2 中的所有行(超出范围)

最佳答案

我认为您想以特定方式对数据帧进行排序,我首先会找到“fname+num”中每个不同值的第一个位置,然后映射两列“fname+num”和“lname+num”,获取每行两列的 min 并使用这些值进行排序:

#find order of first occurence of each element of the column fname+num
dict_order = {val:i for i, val in enumerate(df1['fname+num'].drop_duplicates())}

# create the minimun of in a column sort once both
# fname+num and lanem+num are mapped with the dict_order
df1['to_sort'] = (pd.concat([df1['fname+num'].map(dict_order),
df1['lname+num'].map(dict_order)], axis=1)
.min(axis=1, skipna=True))

#sort by this column,
df2 = df1.sort_values('to_sort').drop('to_sort', axis=1).reset_index(drop=True)

你得到df2:

  fname lname  fnameNum  lnameNum  fnameWeight  lnameWeight fname+num  \
0 A B 1 1 25 35 A,1
1 B A 1 1 35 25 B,1
2 X Z 3 9 2 17 X,3
3 N M 8 7 14 15 N,14

lname+num
0 B,1
1 A,1
2 Z,9
3 M,15

根据评论进行编辑,我想说你应该更改dict_order,其中元素之间的所有连接都在 this method 的帮助下创建

import networkx as nx
G=nx.Graph()
all_tuples=tuple(zip(df['fname+num'],df['lname+num']))
G.add_edges_from(all_tuples)
dict_order = { val:i for i, vals in enumerate(nx.connected_components(G)) for val in vals}

然后是相同的其余代码

关于python - 如何正确迭代两列并弹出数据与新 df 匹配的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56796931/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com