【问题标题】:inserting a list as a column in dataframe at specific location depending on value in row根据行中的值将列表作为列插入数据框中的特定位置
【发布时间】:2020-05-28 15:43:39
【问题描述】:

所以我有一个数据框(tsv/csv 文件),使用 numpy、pandas 和 statsmodels。

在一列“medianame”中,媒体名称(刺激物)将出现在屏幕上(该刺激物正在移动。每一行代表一个时间戳)。

当特定媒体名称出现在此列中时(在本例中,假设为“stimulus1”),是时候在另一列中插入一个列表,比如说 5 个数字,从这个开始继续。

列中的其他项目需要为空(np.nan)。

另一个要求是必须在每次名称“再次”出现在“medianame”列中时插入它。因此,列表中的项目数可能比媒体名称的连续出现次数短(参见下面示例中的第一次出现)。

如果列表中的项目数长于媒体名称的连续出现次数,则必须提前将其切断(参见下例中的第二次)。

例子:

List1 = [5, 7, 1, 8, 9] # to be inserted in column "position"
                        # when medianame "stimulus1" appears in column "medianame"

medianame
stimulus0
stimulus0
stimulus0
stimulus0
stimulus0
stimulus0
NaN
stimulus1
stimulus1
stimulus1
stimulus1
stimulus1
stimulus1
stimulus1
stimulus1
stimulus1
stimulus1
NaN
stimulus2
stimulus2
stimulus2
stimulus2
stimulus2
NaN
stimulus1
stimulus1
stimulus1

添加到正确的位置后,希望它看起来像:

medianame     position
stimulus0     NaN
stimulus0     NaN
stimulus0     NaN
stimulus0     NaN
stimulus0     NaN
stimulus0     NaN
NaN           NaN
stimulus1     5
stimulus1     7
stimulus1     1
stimulus1     8
stimulus1     9
stimulus1     NaN
stimulus1     NaN
stimulus1     NaN
stimulus1     NaN
stimulus1     NaN
NaN           NaN
stimulus2     NaN
stimulus2     NaN
stimulus2     NaN
stimulus2     NaN
stimulus2     NaN
NaN           NaN
stimulus1     5
stimulus1     7
stimulus1     1

【问题讨论】:

    标签: python pandas list statsmodels


    【解决方案1】:

    这是将mergegroupbycumsum 和pd.Series 构造函数一起使用的一种方法:

    df.assign(key = df.groupby((df['medianame'] != 'stimulus1').cumsum()).cumcount())\
      .merge(pd.Series(List1, index=range(1,len(List1)+1)).rename('position'), 
             left_on='key', 
             right_index=True, 
             how='left')\
      .drop('key', axis=1)
    

    输出:

        medianame  position
    0   stimulus0       NaN
    1   stimulus0       NaN
    2   stimulus0       NaN
    3   stimulus0       NaN
    4   stimulus0       NaN
    5   stimulus0       NaN
    6         NaN       NaN
    7   stimulus1       5.0
    8   stimulus1       7.0
    9   stimulus1       1.0
    10  stimulus1       8.0
    11  stimulus1       9.0
    12  stimulus1       NaN
    13  stimulus1       NaN
    14  stimulus1       NaN
    15  stimulus1       NaN
    16  stimulus1       NaN
    17        NaN       NaN
    18  stimulus2       NaN
    19  stimulus2       NaN
    20  stimulus2       NaN
    21  stimulus2       NaN
    22  stimulus2       NaN
    23        NaN       NaN
    24  stimulus1       5.0
    25  stimulus1       7.0
    26  stimulus1       1.0
    

    详情

    创建一个系列,s,索引范围从 1 开始:

    s = pd.Series(List1, index=range(1,len(List1)+1)).rename('position')
    

    输出:

    1    5
    2    7
    3    1
    4    8
    5    9
    Name: position, dtype: int64
    

    现在,让我们将该系列加入到数据帧 df 中刺激 1,但首先我们需要在 df 上创建一个加入键。

    df_key = df.assign(key = df.groupby((df['medianame'] != 'stimulus1').cumsum()).cumcount())
    

    输出:

        medianame  key
    0   stimulus0    0
    1   stimulus0    0
    2   stimulus0    0
    3   stimulus0    0
    4   stimulus0    0
    5   stimulus0    0
    6         NaN    0
    7   stimulus1    1
    8   stimulus1    2
    9   stimulus1    3
    10  stimulus1    4
    11  stimulus1    5
    12  stimulus1    6
    13  stimulus1    7
    14  stimulus1    8
    15  stimulus1    9
    16  stimulus1   10
    17        NaN    0
    18  stimulus2    0
    19  stimulus2    0
    20  stimulus2    0
    21  stimulus2    0
    22  stimulus2    0
    23        NaN    0
    24  stimulus1    1
    25  stimulus1    2
    26  stimulus1    3
    

    ​最后,将 df_key 与 key 和 s.index 上的 s how='left' 合并:

    df_key.merge(s, how='left', left_on='key', right_index=True)
    

    输出:

        medianame  key  position
    0   stimulus0    0       NaN
    1   stimulus0    0       NaN
    2   stimulus0    0       NaN
    3   stimulus0    0       NaN
    4   stimulus0    0       NaN
    5   stimulus0    0       NaN
    6         NaN    0       NaN
    7   stimulus1    1       5.0
    8   stimulus1    2       7.0
    9   stimulus1    3       1.0
    10  stimulus1    4       8.0
    11  stimulus1    5       9.0
    12  stimulus1    6       NaN
    13  stimulus1    7       NaN
    14  stimulus1    8       NaN
    15  stimulus1    9       NaN
    16  stimulus1   10       NaN
    17        NaN    0       NaN
    18  stimulus2    0       NaN
    19  stimulus2    0       NaN
    20  stimulus2    0       NaN
    21  stimulus2    0       NaN
    22  stimulus2    0       NaN
    23        NaN    0       NaN
    24  stimulus1    1       5.0
    25  stimulus1    2       7.0
    26  stimulus1    3       1.0
    

    而且,如果需要,您可以删除该键列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 2020-04-17
      相关资源
      最近更新 更多