Python 如何将列表转换为数据帧

Python 如何将列表转换为数据帧,python,pandas,Python,Pandas,我有以下代码: rows =[] for dt in new_info: x = dt['state'] est = dt['estimates'] col_R = [val['choice'] for val in est if val['party'] == 'Rep'] col_D = [val['choice'] for val in est if val['party'] == 'Dem'] incumb = [val['party'] f

我有以下代码:

rows =[]
for dt in new_info:
    x =  dt['state']
    est = dt['estimates']

    col_R = [val['choice'] for val in est if val['party'] == 'Rep']
    col_D = [val['choice'] for val in est if val['party'] == 'Dem']

    incumb = [val['party'] for val in est if val['incumbent'] == True ]

    rows.append((x, col_R, col_D, incumb))
现在我想把我的行列表转换成一个数据帧。我的行列表的结构如下所示,我的列表有32个条目

当我将其转换为pandas数据框时,我会将数据框中的条目作为列表获取:

pd.DataFrame(rows, columns=["State", "R", "D", "incumbent"])  

但我希望我的数据帧是这样的

新的info变量如下所示

既然您认为列中的对象是列表,我将使用生成器删除包装您的项目的列表:

import pandas as pd
import numpy as np
rows = [(u'KY', [u'McConnell'], [u'Grimes'], [u'Rep']),
        (u'AR', [u'Cotton'], [u'Pryor'], [u'Dem']),
        (u'MI', [u'Land'], [u'Peters'], [])]

def get(r, nth):
    '''helper function to retrieve item from nth list in row r'''
    return r[nth][0] if r[nth] else np.nan

def remove_list_items(list_of_records):
    for r in list_of_records:
        yield r[0], get(r, 1), get(r, 2), get(r, 3)
生成器的工作方式与此函数类似,但它不是作为中间步骤在内存中不必要地具体化列表,而是将列表中的每一行传递给行列表的使用者:

def remove_list_items(list_of_records):
    result = []
    for r in list_of_records:
        result.append((r[0], get(r, 1), get(r, 2), get(r, 3)))
    return result
然后通过生成器(或者列表版本,如果您愿意的话)来合成数据帧

或者您可以使用列表理解或生成器表达式(如图所示)执行基本相同的操作:

>>> df = pd.DataFrame.from_records(
      ((r[0], get(r, 1), get(r, 2), get(r, 3)) for r in rows), 
      columns=["State", "R", "D", "incumbent"])

您可以使用一些内置的python列表操作并执行以下操作:

df['col1'] = df['col1'].apply(lambda i: ''.join(i))
这将产生:

    col1 col2
0    a  [d]
1    b  [e]
2    c  [f]
显然,
col2
没有格式化以显示对比度

编辑 根据OP的要求,如果要对所有列实施
apply(lambda…
,则可以使用类似于上面的行显式设置每一列,将
'col1'
替换为您希望更改的每一列名称,或者您可以像这样在列上循环:

如果您有类型为的数据帧

x = [['a'],['b'],['c'],['d']]
y = [['e'],['f'],['g'],['h']]
z = [['i'],['j'],['k'],['l']]

df = pd.DataFrame({'col1':x, 'col2':y, 'col3':z})
然后可以在列上循环

for col in df.columns:
    df[col] = df[col].apply(lambda i: ''.join(i))
它转换一个以如下方式开始的数据帧:

   col1 col2 col3
0  [a]  [e]  [i]
1  [b]  [f]  [j]
2  [c]  [g]  [k]
3  [d]  [h]  [l]
变成

    col1 col2 col3
0    a    e    i
1    b    f    j
2    c    g    k
3    d    h    l

@ElizabethSusanJoseph我的解决方案不能解决您的问题吗?但我如何将其应用于我的整个数据帧??你能编辑你对我的问题的答案吗?如果我执行你的代码,这将非常有帮助。DataFrame(行、列=[“State”,“R”,“D”,“responsible”])新的[R”,“D”,“responsible']]。apply(lambda i:''。join(i)),我会得到一个错误。你的解决方案简单得多,但我得到一个值错误“所有数组必须具有相同的长度”。以下是完整的代码版本:@ElizabethSusanJoseph,这意味着在尝试构造数据帧时,列的长度并不都相同。在将包含条目的数据框构建为列表(原始问题中的第一个数据框图像)后,可以使用我的实现,然后在列上循环以将列表转换为字符串值。
    col1 col2 col3
0    a    e    i
1    b    f    j
2    c    g    k
3    d    h    l