问题的措辞可能令人困惑,但在以下数据框架中,我希望能够选择第一行和最后一行:
dt = [['BOS','SF'],['SF','LA'],['LA','NYC'],['SF','BOS'],
]
my_df= pd.DataFrame(columns = ['Source','destination'], data = dt)
my_df换句话说,标识行对,其中第一行的目的地是另一行的源,反之亦然。
似乎是个简单的问题,但我想不出任何解决办法。
发布于 2021-07-01 18:57:24
忽略两列之间顺序的一个选项是对其内部的每一行进行排序,这是np.sort可以做到的。然后,您可以使用这些有序行形成一个新的dataframe。duplicated和keep=False将所有重复的行标记为True,我们可以使用它作为掩码来索引原始数据:
rows_sorted_df = pd.DataFrame(np.sort(df))
dups = rows_sorted_df.duplicated(keep=False)
result = df[dups]要获得
>>> 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发布于 2021-07-01 19:08:14
如果将列分离为单独的数据格式,则可以合并它们以只获得匹配的行。
(在本例中,我在每个df中将列重命名为“code”;或者,您可以在right_on调用中指定merge和left_on参数。)
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发布于 2021-07-01 23:23:32
海事组织,最好的方法是使用这样的join:
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)这是输出(一开始有点混乱):
destination Source
BOS SF SF
LA NYC SF
SF LA BOS
SF BOS BOS如果我们更深入地思考,这是有意义的。让我们从输入中提取这些行:
['SF','LA'],
['LA','NYC'],我们的join将这些行转换为“->中间-> dest”或"SF -> LA -> NYC“。看看我们的结果表
destination Source
LA NYC SF我们可以通过行'LA‘的索引将其理解为“从Source列'SF’到目标列'NYC‘。如果您希望数据更易读,可以添加以下内容:
joined_df.index.name = 'middle'
joined_df = joined_df.reset_index()
print(joined_df)https://stackoverflow.com/questions/68215511
复制相似问题