我有一个数据框架,其中有两列我希望对其进行迭代。想法是找到该项目所在的任何行(在任一列中),然后将该行移至单独的数据框。下面的例子很难说。
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+num
和lname+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
未显示*删除df2中存在的df1中的所有行(超出范围)
答案 0 :(得分:1)
我认为您想以特定的方式对数据框进行排序,我首先要在'fname + num'中找到每个不同值的第一位置,然后map
分别在'fname + num'和'lname列中找到+ num',将min
设置为每行两列,并使用以下值获取sort
:
#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}
然后是其余的相同代码