首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫识别两列具有相同字符串的行。

熊猫识别两列具有相同字符串的行。
EN

Stack Overflow用户
提问于 2021-07-01 18:48:53
回答 3查看 476关注 0票数 3

问题的措辞可能令人困惑,但在以下数据框架中,我希望能够选择第一行和最后一行:

代码语言:javascript
运行
复制
dt = [['BOS','SF'],['SF','LA'],['LA','NYC'],['SF','BOS'],
      ]
my_df= pd.DataFrame(columns = ['Source','destination'], data = dt)
my_df

换句话说,标识行对,其中第一行的目的地是另一行的源,反之亦然。

似乎是个简单的问题,但我想不出任何解决办法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-07-01 18:57:24

忽略两列之间顺序的一个选项是对其内部的每一行进行排序,这是np.sort可以做到的。然后,您可以使用这些有序行形成一个新的dataframe。duplicatedkeep=False将所有重复的行标记为True,我们可以使用它作为掩码来索引原始数据:

代码语言:javascript
运行
复制
rows_sorted_df = pd.DataFrame(np.sort(df))
dups = rows_sorted_df.duplicated(keep=False)
result = df[dups]

要获得

代码语言:javascript
运行
复制
>>> rows_sorted_df

     0    1
0  BOS   SF
1   LA   SF
2   LA  NYC
3  BOS   SF

>>> dups

0     True
1    False
2    False
3     True

>>> result

  Source destination
0    BOS          SF
3     SF         BOS
票数 1
EN

Stack Overflow用户

发布于 2021-07-01 19:08:14

如果将列分离为单独的数据格式,则可以合并它们以只获得匹配的行。

(在本例中,我在每个df中将列重命名为“code”;或者,您可以在right_on调用中指定mergeleft_on参数。)

代码语言:javascript
运行
复制
s = my_df['Source'].reset_index().rename(columns={'Source':'code', 'index':'source_index'})
d = my_df['destination'].reset_index().rename(columns={'destination':'code', 'index':'dest_index'})

sd = pd.merge(s, d)


In: sd
Out: 
   source_index code  dest_index
0             0  BOS           3
1             1   SF           0
2             3   SF           0
3             2   LA           1
票数 0
EN

Stack Overflow用户

发布于 2021-07-01 23:23:32

海事组织,最好的方法是使用这样的join

代码语言:javascript
运行
复制
import pandas as pd

dt = [
  ['BOS','SF'],
  ['SF','LA'],
  ['LA','NYC'],
  ['SF','BOS'],
]

my_df = pd.DataFrame(columns = ['Source','destination'], data = dt)
source_df = my_df.set_index('Source')
dest_df = my_df.set_index('destination')
joined_df = source_df.join(dest_df)

print(joined_df)

这是输出(一开始有点混乱):

代码语言:javascript
运行
复制
    destination Source
BOS          SF     SF
LA          NYC     SF
SF           LA    BOS
SF          BOS    BOS

如果我们更深入地思考,这是有意义的。让我们从输入中提取这些行:

代码语言:javascript
运行
复制
  ['SF','LA'],
  ['LA','NYC'],

我们的join将这些行转换为“->中间-> dest”或"SF -> LA -> NYC“。看看我们的结果表

代码语言:javascript
运行
复制
    destination Source
LA          NYC     SF

我们可以通过行'LA‘的索引将其理解为“从Source列'SF’到目标列'NYC‘。如果您希望数据更易读,可以添加以下内容:

代码语言:javascript
运行
复制
joined_df.index.name = 'middle'
joined_df = joined_df.reset_index()
print(joined_df)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68215511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档