【问题标题】:Making a list ouf of values in a DataFrame depending on values in another column根据另一列中的值制作 DataFrame 中的值列表
【发布时间】:2018-04-29 17:48:38
【问题描述】:

我有一个 pandas 数据框,如图所示。该框架中还有更多与任务无关的列。

id    pos      value       sente
1     a         I           21
2     b         have        21
3     b         a           21
4     a         cat         21
5     d         !           21
1     a         My          22
2     a         cat         22
3     b         is          22
4     a         cute        22
5     d         .           22

我想从某些列中列出一个列表,所以第一句 (sente=21) 和其他句子看起来都差不多。意味着每个句子都有自己的唯一条目。

`[('I', 'a', '1'), ..., ('!','d','5')]`

我已经有一个函数可以为一个句子执行此操作,但我不知道如何为框架中的所有句子(具有相同句子值的句子)执行此操作。

`class SentenceGetter(object):
  def __init__(self, data):
    self.n_sent = 1
    self.data = data
    self.empty = False
  def get_next(self):
    for t in self.data:
        try:
            s = self.data[(self.data["sente"] == 21)]
            self.n_sent += 1
            return 
              s["id"].values.tolist(),   
              s["pos"].values.tolist(),
              s["value"].values.tolist() 
        except:
            self.empty = True
            return None,None,None

foo = SentenceGetter(df)
sent, pos, token = foo.get_next()
in = zip(token, pos, sent)

`

由于我的框架非常大,所以无法使用这样的结构:

df.loc[((df["sente"] == df["sente"].shift(-1)) & (df["sente"] == df["sente"].shift(+1))), ["pos","value","id"]]

有什么想法吗?

【问题讨论】:

    标签: python pandas dataframe multiple-columns


    【解决方案1】:

    如果您愿意使用标准库,collections.defaultdict 提供 O(n) 解决方案:

    from collections import defaultdict
    
    d = defaultdict(list)
    
    for _, num, *data in df[['sente', 'value', 'pos', 'id']].itertuples():
        d[num].append(data)
    

    结果:

    defaultdict(list,
                {21: [('I', 'a', 1),
                      ('have', 'b', 2),
                      ('a', 'b', 3),
                      ('cat', 'a', 4),
                      ('!', 'd', 5)],
                 22: [('My', 'a', 1),
                      ('cat', 'a', 2),
                      ('is', 'b', 3),
                      ('cute', 'a', 4),
                      ('.', 'd', 5)]})
    

    【讨论】:

      【解决方案2】:

      您还可以使用groupbyapply 函数。

      方法一:给出一个数据框

      (df
       .groupby('sente')
       .apply(lambda df: list(tuple(x) for x in df[['value','pos','id']].values))
       .reset_index()
       .rename(columns={0: 'values'}))
      
         sente                                             values
      0     21  [(I, a, 1), (have, b, 2), (a, b, 3), (cat, a, ...
      1     22  [(My, a, 1), (cat, a, 2), (is, b, 3), (cute, a...
      

      方法二:给出字典

      (df
       .groupby('sente')
       .apply(lambda df: list(tuple(x) for x in df[['value','pos','id']].values))
       .reset_index()
       .set_index('sente')[0].to_dict())
      

      【讨论】:

        【解决方案3】:

        和@YOLO的回答基本一样

        def f(df):
            s = df[['value','pos','id']].apply(tuple, axis=1)
            return s.tolist()
        g = df.groupby('sente')
        q = g.apply(f)
        

        >>> type(q)
        <class 'pandas.core.series.Series'>
        >>> q[21]
        [('I', 'a', 1), ('have', 'b', 2), ('a', 'b', 3), ('cat', 'a', 4), ('!', 'd', 5)]
        >>> q[22]
        [('My', 'a', 1), ('cat', 'a', 2), ('is', 'b', 3), ('cute', 'a', 4), ('.', 'd', 5)]
        
        >>> q.tolist()
        [[('I', 'a', 1), ('have', 'b', 2), ('a', 'b', 3), ('cat', 'a', 4), ('!', 'd', 5)], [('My', 'a', 1), ('cat', 'a', 2), ('is', 'b', 3), ('cute', 'a', 4), ('.', 'd', 5)]]
        >>>
        >>> q.to_dict()
        {21: [('I', 'a', 1), ('have', 'b', 2), ('a', 'b', 3), ('cat', 'a', 4), ('!', 'd', 5)], 22: [('My', 'a', 1), ('cat', 'a', 2), ('is', 'b', 3), ('cute', 'a', 4), ('.', 'd', 5)]}
        >>>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-15
          • 2019-07-17
          • 1970-01-01
          • 1970-01-01
          • 2015-08-03
          • 2019-09-19
          • 2015-07-11
          相关资源
          最近更新 更多