如何根据另一个拆分 pandas 中的系列
how to split a series in pandas based on another
我有两个系列 python pandas.
一个来自名为 values.csv
的文件中的值。它看起来像这样:
time, value
0, 10312435
9, 45924523
11, 43423434
20, 42343552
...
另一个叫做 breaks.csv
,看起来像这样:
time
5
18
...
问题:我想根据 breaks.csv
.
中的值将 values.csv
分成单独的帧
在上面的示例中,第一个断点是 5
,导致文件或集合包含 time \in [0, 5]
内的所有条目,因此只有值 0, 10312435
。第二个断点是 18
,因此第二批值应该在 (5, 18]
内,即 9, 45924523
和 11, 43423434
等等。
在 pandas(或者其他一些易于使用的 python 包)中是否可以实现类似的功能?
您可以先从 breaks.time
形成分类,然后使用 pd.cut
:
将这些分类分配给 values.time
import numpy as np
# intervals to fall into
bins = [-np.inf, *breaks.time, +np.inf]
# distinct labels of 0..N-1
labels = np.arange(len(bins) - 1)
# form a new column in `values` with assigned categories
values["cats"] = pd.cut(values.time, bins=bins, labels=labels)
此时values
看起来像:
>>> values
time value cats
0 0 10312435 0
1 9 45924523 1
2 11 43423434 1
3 20 42343552 2
现在我们可以按 cats
分组,例如,形成数据帧列表:
# no need for `cats` column anymore, so we drop it when putting in
frames_list = [frame.drop(columns="cats")
for _, frame in values.groupby("cats")[["time", "value"]]]
我们可以访问这些帧
>>> frames_list[0]
time value
0 0 10312435
>>> frames_list[1]
time value
1 9 45924523
2 11 43423434
>>> frames_list[2]
time value
3 20 42343552
我根据
得出以下结论
sim_dist_right = pandas.read_csv('sim/dist_right.csv', comment='#')
sim_round_indicator = pandas.read_csv('sim/round_indicator.csv', comment='#')
round_list = []
for index, row in sim_round_indicator.iterrows():
print("splitting at " + str(row['time']))
df_sep = sim_dist_right[sim_dist_right['time'] < row['time']]
round_list.append(df_sep)
print("separated a batch of " + str(len(df_sep)) + " elements")
df_over = sim_dist_right[sim_dist_right['time'] >= row['time']]
print(str(len(df_over)) + " elements over")
sim_dist_right = df_over
print("splitted values into " + str(len(round_list)) + " batches")
我有两个系列 python pandas.
一个来自名为 values.csv
的文件中的值。它看起来像这样:
time, value
0, 10312435
9, 45924523
11, 43423434
20, 42343552
...
另一个叫做 breaks.csv
,看起来像这样:
time
5
18
...
问题:我想根据 breaks.csv
.
values.csv
分成单独的帧
在上面的示例中,第一个断点是 5
,导致文件或集合包含 time \in [0, 5]
内的所有条目,因此只有值 0, 10312435
。第二个断点是 18
,因此第二批值应该在 (5, 18]
内,即 9, 45924523
和 11, 43423434
等等。
在 pandas(或者其他一些易于使用的 python 包)中是否可以实现类似的功能?
您可以先从 breaks.time
形成分类,然后使用 pd.cut
:
values.time
import numpy as np
# intervals to fall into
bins = [-np.inf, *breaks.time, +np.inf]
# distinct labels of 0..N-1
labels = np.arange(len(bins) - 1)
# form a new column in `values` with assigned categories
values["cats"] = pd.cut(values.time, bins=bins, labels=labels)
此时values
看起来像:
>>> values
time value cats
0 0 10312435 0
1 9 45924523 1
2 11 43423434 1
3 20 42343552 2
现在我们可以按 cats
分组,例如,形成数据帧列表:
# no need for `cats` column anymore, so we drop it when putting in
frames_list = [frame.drop(columns="cats")
for _, frame in values.groupby("cats")[["time", "value"]]]
我们可以访问这些帧
>>> frames_list[0]
time value
0 0 10312435
>>> frames_list[1]
time value
1 9 45924523
2 11 43423434
>>> frames_list[2]
time value
3 20 42343552
我根据
sim_dist_right = pandas.read_csv('sim/dist_right.csv', comment='#')
sim_round_indicator = pandas.read_csv('sim/round_indicator.csv', comment='#')
round_list = []
for index, row in sim_round_indicator.iterrows():
print("splitting at " + str(row['time']))
df_sep = sim_dist_right[sim_dist_right['time'] < row['time']]
round_list.append(df_sep)
print("separated a batch of " + str(len(df_sep)) + " elements")
df_over = sim_dist_right[sim_dist_right['time'] >= row['time']]
print(str(len(df_over)) + " elements over")
sim_dist_right = df_over
print("splitted values into " + str(len(round_list)) + " batches")