如何合并行以包含pandas中的值列表?

时间:2019-07-19 23:31:53

标签: python pandas dataframe

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

我的解决方案是循环执行以下代码:

<script>

尽管结果看起来还不错,但循环非常缓慢且无故复杂。另外,如果我再次像这样合并行,结果将是列表中的列表,这也是不希望的。


该过程应该如下:

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)
  1. 数据框:
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,2,3合并时间之后:
4,5
  1. 稍后合并索引 time text 0 [1, 2, 3] [foo, bar, foo] 1 [4, 5] [bar, foo] [1,2,3]后:
[4,5]

3 个答案:

答案 0 :(得分:0)

这可能有效:


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

答案 1 :(得分:0)

第一个问题

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 :(得分:0)

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

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]