如何正确地遍历两列并弹出数据与新数据匹配的行

2024-09-30 00:25:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含两列的数据帧,我希望遍历这两列。其思想是找到项目出现的任何行(在任一列中),然后将该行移动到单独的数据帧中。下面的例子,单词很难。你知道吗

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中的所有行(超出范围)


Tags: 数据inlengroupfnamenumrowdf1
1条回答
网友
1楼 · 发布于 2024-09-30 00:25:47

我想您想以一种特定的方式对数据帧进行排序,我会首先在'fname+num'中找到每个不同值的第一个位置,然后map列'fname+num'和'lname+num',获得每行两列的minsort的值:

#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}

剩下的代码也一样

相关问题 更多 >

    热门问题