【发布时间】:2020-06-30 17:36:58
【问题描述】:
这是一个关于如何正确使用 pandas 的问题(我使用版本 1.0)。
假设我有一个带有任务的 DataFrame,其中包含一个起点和一个或多个目的地:
mid from to
0 0 A [C]
1 1 A [B, C]
2 2 B [B]
3 3 C [D, E, F]
例如:对于任务 (mid=1),人们将从A 到B,然后从B 到C,最后从C 到A。请注意,我无法控制输入 DataFrame 的数据模型。
我想计算每次任务旅行的指标。预期的输出将是:
tid mid from to
0 0 0 A C
1 1 0 C A
2 2 1 A B
3 3 1 B C
4 4 1 C A
5 5 2 B B
6 6 2 B B
7 7 3 C D
8 8 3 D E
9 9 3 E F
10 10 3 F C
我找到了实现目标的方法。请在下面找到 MCVE:
import pandas as pd
# Input:
df = pd.DataFrame(
[["A", ["C"]],
["A", ["B", "C"]],
["B", ["B"]],
["C", ["D", "E", "F"]]],
columns = ["from", "to"]
).reset_index().rename(columns={'index': 'mid'})
# Create chain:
df['chain'] = df.apply(lambda x: list(x['from']) + x['to'] + list(x['from']), axis=1)
# Explode chain:
df = df.explode('chain')
# Shift to create travel:
df['end'] = df.groupby("mid")["chain"].shift(-1)
# Remove extra row, clean, reindex and rename:
df = df.dropna(subset=['end']).reset_index(drop=True).reset_index().rename(columns={'index': 'tid'})
df = df.drop(['from', 'to'], axis=1).rename(columns={'chain': 'from', 'end': 'to'})
我的问题是:有没有更好/更简单的方法来使用 Pandas 制作它?我说的更好是指,不需要更高的性能(它可能会偏离路线),但更易读和更直观.
【问题讨论】:
标签: python-3.x pandas graph code-readability