pandas数据框中行的列表列表

时间:2018-05-14 17:24:39

标签: python list pandas dataframe

使用我的脚本后,我的算法会在列表列表中返回已检测到的结果,如下所示:pred=[[b,c,d],[b,a,u],...[b,i,o]]

我已经拥有一个需要在新匹配列中添加这些值的数据框。 该列表与框架中的其他列完全相同x,我只需创建一个包含列表所有值的新列。

但是,当我尝试将列表放入列中时,我收到错误:

ValueError: Length of values does not match length of index

查看数据,它将整个列表放在一行而不是新行中的每个条目。

编辑:

列表中的所有值都应放在列名pred

sent  token   pred
 0     a        b
 0     b        c
 0     b        d
 1     a        b
 1     b        a
 1     c        u

解决方案:

x = []
for _ in pred:
  if _ is not None:
    x += _

df_new = pd.DataFrame(df)
df_new["pred"] = list(itertools.chain.from_iterable(x))

2 个答案:

答案 0 :(得分:1)

import pandas as pd

# combine input lists
x = []
for _ in [['b','c','d'],['b','a','u'], ['b','i','o']]:
    x += _

# output into a single column
a = pd.Series(x)

# mock original dataframe
b = pd.DataFrame({'sent': [0, 0, 0, 1, 1, 1], 
                  'token': ['a', 'b', 'b', 'a', 'b', 'c']})

# add column to existing dataframe
# this will avoid the mis matched length error by ignoring anything longer 
# than your original data frame
b['pred'] = a

   sent token pred
0     0     a    b
1     0     b    c
2     0     b    d
3     1     a    b
4     1     b    a
5     1     c    u

答案 1 :(得分:1)

您可以使用itertools.chain,它可以展平列表列表,然后您可以根据数据帧的长度进行切片。

来自@ak_slick的数据。

import pandas as pd
from itertools import chain

df = pd.DataFrame({'sent': [0, 0, 0, 1, 1, 1], 
                   'token': ['a', 'b', 'b', 'a', 'b', 'c']})

lst = [['b','c',None],['b',None,'u'], ['b','i','o']]

df['pred'] = list(filter(None, chain.from_iterable(lst)))[:len(df.index)]

print(df)

   sent token pred
0     0     a    b
1     0     b    c
2     0     b    d
3     1     a    b
4     1     b    a
5     1     c    u