【问题标题】:How to merge rows to contain a list of the values in pandas?如何合并行以包含熊猫中的值列表?
【发布时间】:2019-07-19 23:31:53
【问题描述】:

我有一组包含带有时间戳的推文的 DataFrame。为了创建每日时间序列,我尝试在每个 DataFrame 中按天合并行。

我的解决方案是循环使用这段代码:

df_temp = df[df['created_sec'].isin(range(date_start,date_end))]
df_temp = pd.DataFrame(zip(df_temp.T.values), index= df_temp.columns)
data    = data.append(df_temp.T)

虽然结果看起来不错,但循环非常缓慢和复杂,没有任何原因。另外,如果我像这样再次合并行,结果将是列表中的列表,这也是不可取的。


流程应该如下:

df = pd.DataFrame({'time': [1,2,3,4,5],
                   'text': ['foo', 'bar', 'foo', 'bar', 'foo']})
  1. 数据帧:
        time    text
    0   1       foo
    1   2       bar
    2   3       foo
    3   4       bar
    4   5       foo
  1. 合并后时间1,2,3 & 4,5:
        time        text
    0   [1, 2, 3]   [foo, bar, foo]
    1   [4, 5]      [bar, foo]
  1. 在稍后合并索引 [1,2,3][4,5] 后:
        time            text
    0   [1, 2, 3, 4, 5] [foo, bar, foo, bar, foo]

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    第一个问题

    s = df.groupby(df.index//3).agg(list)
    s
            time             text
    0  [1, 2, 3]  [foo, bar, foo]
    1     [4, 5]       [bar, foo]
    

    第二个问题

    s.sum().to_frame(0).T
                  time                       text
    0  [1, 2, 3, 4, 5]  [foo, bar, foo, bar, foo]
    

    【讨论】:

      【解决方案2】:

      这可能有效:

      
      def summarize(df,start,end,columns):
          row = {}
          for col in columns:
              print(df[col][start:end].tolist())
              row[col]=df[col][start:end].tolist()
      
          df =df.append(row,ignore_index=True)
          df=df.drop(df.index[range(start,end)])
          df = df.reset_index()
          return df
      

      【讨论】:

        【解决方案3】:

        您可以尝试创建一个将数据合并到列表中的函数,如下所示:

        df = pd.DataFrame({'time': [1,2,3,4,5],
                           'text': ['foo', 'bar', 'foo', 'bar', 'foo']})
        df
        
            text    time
        0   foo     1
        1   bar     2
        2   foo     3
        3   bar     4
        4   foo     5
        
        def consolidate(df, break_index): #df = dataframe, break_index = index where you want to create the first list
            text = [[x for x in df['text'][0:break_index]]]
            time = [[x for x in df['time'][0:break_index]]]
            if break_index == len(df):
                pass
            else:
                time.append([x for x in df['time'][break_index:]])
                text.append([x for x in df['text'][break_index:]])
            df2 =pd.DataFrame({'time':time,'text':text})
            return df2
        
        consolidate(df,3)
            text             time
        0   [foo, bar, foo]  [1, 2, 3]
        1   [bar, foo]       [4, 5]
        
        consolidate(df,5)
            text                        time
        0   [foo, bar, foo, bar, foo]   [1, 2, 3, 4, 5]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-12
          • 2019-03-07
          • 2017-04-17
          • 1970-01-01
          • 2023-02-05
          • 1970-01-01
          • 2018-03-15
          • 1970-01-01
          相关资源
          最近更新 更多