Python 如何正确地遍历数据与新df匹配的两列和弹出行
我有一个包含两列的dataframe,我希望遍历这两列。其思想是找到项目出现的任何行(在任一列中),然后将该行移动到单独的数据帧中。下面的例子,单词很难 df1: 我们的想法是要做到以下几点:Python 如何正确地遍历数据与新df匹配的两列和弹出行,python,pandas,Python,Pandas,我有一个包含两列的dataframe,我希望遍历这两列。其思想是找到项目出现的任何行(在任一列中),然后将该行移动到单独的数据帧中。下面的例子,单词很难 df1: 我们的想法是要做到以下几点: fname lname fnameNum lnameNum fnameWeight lnameWeight fname+num lname+num X Z 3 9 2 17 X,3 Z,9 N
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
获取第一行,并将其复制到新的数据帧
df2:
然后,获取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
未显示*删除df1中存在于df2中的所有行(超出范围)我想您想以一种特定的方式对数据帧进行排序,我会首先在'fname+num'中找到每个不同值的第一个位置,然后
map
列'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
带着对评论的期待进行编辑,我想说您应该更改命令
,元素之间的所有连接都是通过
当你说:“继续这样做直到df1实际上是空的”时,代码的剩余部分也是一样的,你的意思是每次在
df2
中添加行还是每次创建一个单独的行?@Ben.T我的意思是填充df2
并删除df1
中出现在df2
中的任何行,所以我认为你的问题更多的是排序problem@Ben.T是的,还是更多less@MaxB添加copy()
并删除下拉列表
,因为此列将包含您的组,即使它可能不是实际数据中的连续数字:df2=df1.sort_值('to_sort')。重置_索引(drop=True)。copy()
@MaxB这取决于第一个A,1
在您的列fname+num中的时间,您解释问题的方式并不是说同一元素必须在同一组中。在您给出的示例中,如果您将最后一行中的B,1
更改为Z,9
?@MaxB oh,那么这将是一个不同的问题。为了满足这一期望,这种方法可能很难改变。我感谢您迄今为止提供的帮助。有时候,正确地问问题本身总是一个障碍。@MaxB确实:)我知道你可以使用networkx来做这类事情,我最近看到一个QA给出了一个很好的答案,我正在寻找答案
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
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}