【问题标题】:Python: splitting DataFrame based on numerical sequencePython:基于数字序列拆分DataFrame
【发布时间】:2019-07-14 19:17:27
【问题描述】:

我正在寻找基于一列中的多个预定义数字序列(在本例中为 state)拆分 pandas DataFrame 的 Pythonic 实现。

示例:

sequence_1 = [4, 1, 5, 2]
sequence_2 = [3, 0]
test_data = pd.DataFrame({'state': [4, 1, 5, 2, 4, 1, 5, 2, 3, 0, 4, 1, 5, 2, 3, 0],
                      'output': [1, 1, 0, 1, 1, 3, 1, 1, 3, 2, 2, 2, 2, 0, 0, 0]})

期望的输出: 拆分成

0 4 1
1 1 1
2 5 0
3 2 1

4 4 1
5 1 3
6 5 1
7 2 1

8 3 3
9 0 2

等等。

只要它保留索引和其他值,我不担心输出格式。我看过pandas.DataFrame.groupby,但没有任何运气。我也试过isin,但它需要按顺序匹配特定的序列,并且所有值都存在。

任何帮助将不胜感激!

【问题讨论】:

  • 是否有可能某些行不会在您正在寻找的任何拆分中?在您的示例中,它将是状态为 6 的行或状态为 4 的行,但后跟 0 而不是 1(例如顺序与您的序列列表中不同)。第二个问题:序列可以有共同的价值吗?
  • 对于您的第一个问题:这是可能的,但仅限于 df 的开头或结尾(序列被提前切断 - 在这种情况下,理想的行为是忽略并丢弃它们)。 0-5之外不会有任何状态。
  • 第二个问题:没有共同的价值观。

标签: python pandas dataframe sequence


【解决方案1】:

如果state 中的数据像您的示例中那样有序,那么一种快速方法是仅捕获两个序列的第一个元素,然后在groupby 中捕获cumsum,例如:

for name_g, df_g in test_data.groupby(((test_data.state == sequence_1[0])| 
                                       (test_data.state == sequence_2[0]) ).cumsum()):
    print (df_g)

一种更通用的方法是使用shift 检查序列是否按正确的顺序,然后在list 中获取数据帧,例如:

ser_seq1 = np.array([test_data.state.shift(-i) == val 
                     for i, val in enumerate(sequence_1)]).all(0)
list_df_seq1 = [test_data.loc[i:i+len(sequence_1)] 
                for i in test_data.index[ser_seq1]]

sequence_2一样

【讨论】:

  • 谢谢!您的第一个解决方案正是我所追求的。
猜你喜欢
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 2021-08-26
相关资源
最近更新 更多