迭代pandas数据框中的列表元素 - 每个条目都有不同的大小,需要在列表

时间:2018-02-22 18:02:50

标签: python pandas dataframe

我有一个数据框

enter image description here

这里我有一个名为" name split"这是一个列表列。 现在我想拆分列表的内容并为每个列创建单独的列。

这是我到目前为止所尝试的:

df = pd.read_csv("C:/Users/Transorg-PC/Desktop/Training/py/datase/football.csv")

temp = df.copy()

temp['name'] = temp['name'].apply(lambda x: ' '.join(x.split()))

temp['name split'] = temp['name'].apply(lambda x: x.split())

temp['length'] = temp['name split'].str.len()

for i in range(temp['length'].max()-1):
    temp[i] = temp['name split'].apply(lambda x:x[i])

但我无法像这样迭代,因为在某些情况下索引超出范围。 那么如何在单独的列中拆分列表的内容。

3 个答案:

答案 0 :(得分:2)

来自jpp的数据

pd.concat([df,pd.DataFrame(df.name.tolist())],1)
Out[1596]: 
   A    name  0  1
0  1  [1, 2]  1  2
1  1  [3, 4]  3  4
2  2  [5, 6]  5  6

更新

df=pd.DataFrame([[1,[1, 2]],
                   [1,[3, 4]],
                   [2,[5, 6,1,1]]],
                  columns=['A','name'])
pd.concat([df,pd.DataFrame(df.name.tolist())],1)
Out[1602]: 
   A          name  0  1    2    3
0  1        [1, 2]  1  2  NaN  NaN
1  1        [3, 4]  3  4  NaN  NaN
2  2  [5, 6, 1, 1]  5  6  1.0  1.0

答案 1 :(得分:2)

这是一种方式:

df = pd.DataFrame([[1,[1, 2, 3]],
                   [1,[3, 4]],
                   [2,[5, 6, 7, 8]]],
                  columns=['A','name'])

df = df.join(pd.DataFrame(df['name'].tolist()))

#    A          name    0    1    2    3
# 0  1     [1, 2, 3]  1.0  2.0  3.0  NaN
# 1  1        [3, 4]  3.0  4.0  NaN  NaN
# 2  2  [5, 6, 7, 8]  5.0  6.0  7.0  8.0

答案 2 :(得分:0)

列表推导在以下情况下很有用:

temp['name'] = temp['name'].apply(lambda x: ' '.join(x.split()))
temp['Name1'] = [item.split()[0] for item in temp['name']]
temp['Name2'] = [item.split()[1] for item in temp['name']]

编辑:注意到在进行拆分后,每个条目都有不同数量的项目。您需要决定如何处理这个问题 - 您希望如何填充新列中的空行?添加空字符串或NaN?我假设这就是你得到IndexError

的原因

如果你想在每一行中使用不同数量的项目,这段代码将为你处理。虽然,我会考虑为什么你想要这些非均匀的列,如果没有更简洁的方法来实现你的目标。

temp['name_split'] = temp['name'].apply(lambda a: a.split())
max_len = max(temp['name_split'].apply(len))

for ii in range(max_len):
    temp['Name%s'%ii] = [item[ii] if ii < len(item) else 'blank' for item in temp['name_split']]