使用dataframe.apply(类似于MapReduce)将panda中的每一行扩展为多行



这是我的问题的简化版本。我有一个DataFrame,它有行程的开始和结束位置。我想最终得到一个DataFrame,它为每个工作站都有到达和离开的人数。

我熟悉类似MapReduce的工作流,在映射阶段I可以取一行并输出多行,然后在减少阶段中聚集在所有行上。

这是我现在拥有的代码,它不起作用。

import pandas as pd
import numpy as np
def expand_row(row):
  return pd.Series(
    { 'station': [row['start_station'], row['end_station']],
      'departures': [1, 0],
      'arrivals': [0, 1],
    },
  )
trips = pd.DataFrame({
  'start_station': ['a', 'c'],
  'end_station': ['b', 'a'],
})
expanded = df.apply(expand_row, axis=1)
aggregated = expanded.groupby('station').aggregate(np.sum)

我想要的最后一个DataFrame是

desired_df = pd.DataFrame({
  'station': ['a', 'b', 'c'],
  'departures': [1, 0, 1],
  'arrivals': [1, 1, 0]
})
desired_df.index = desired_df.pop('station')

非常感谢。

import pandas as pd
trips = pd.DataFrame({
  'start_station': ['a', 'c'],
  'end_station': ['b', 'a'],
})
trips.apply(pd.value_counts).fillna(0)

结果是:

   end_station  start_station
a            1              1
b            1              0
c            0              1