python - 从 Pandas 单元格中提取列表并使用列表元素作为新列

标签 python loops pandas

尝试创建一个数据框,其中包含选举名称、结果(共和党 - 民主党普选票,作为分数)以及每次民意调查的民意调查差异。到目前为止我的代码:

def results_polls_diff(editinfo, polls):
    rows = []
    for i, election in enumerate(editinfo):
        polls_key = election['slug']
        this_election = polls[polls_key]

        npolls = this_election.shape[0]

        diff = (this_election[candidates['R'].ix[i]] - this_election[candidates['D or I'].ix[i]])/100


        for c in election['estimates']:
            if c['party'] == 'Rep' :
                r1 = c['value']

        for c in election['estimates']:
            if c['party'] == 'Dem' or c['party'] == 'ind' :
                r2 = c['value']

        result = (r1-r2)/100

        #init_rows = []
        #for d in diff:
        #    init_rows.append((polls_key, result, d))
        #return init_rows

        rows.append((polls_key, result, [d for d in diff]))
    return rows
result_df = pd.DataFrame(results_polls_diff(editinfo, polls), columns = ['race', 'result', 'diff_list'])
result_df.head()

输出:

race                                   result       diff_list
0   2014-delaware-senate-wade-vs-coons  -0.220  [-0.18, -0.16, -0.25, -0.15]
1   2014-massachusetts-senate-herr-vs-markey    -0.207  [-0.2, -0.15, -0.16, -0.25, -0.22, -0.26, -0.2...
2   2014-rhode-island-senate-zaccaria-vs-reed   -0.207  [-0.45, -0.42, -0.35]
3   2014-montana-senate-daines-vs-curtis    0.177   [0.14, 0.18, 0.16, 0.21, 0.13]
4   2014-hawaii-senate-cavasso-vs-schatz    -0.477  [-0.52, -0.26, -0.51, -0.54, -0.37, -0.32]

我的目标更像是这样:

race                                  result    diff_list
0   2014-delaware-senate-wade-vs-coons  -0.22   -0.18
1   2014-delaware-senate-wade-vs-coons  -0.22   -0.16
2   2014-delaware-senate-wade-vs-coons  -0.22   -0.25
3   2014-delaware-senate-wade-vs-coons  -0.22   -0.15

如果我使用代码的散列部分并将附加更改为 rows.append((init_rows)),我会得到该结果,但它似乎并没有迭代所有不再是editinfo了。因此,我正在寻找的解决方案要么是一种使迭代工作的方法,要么从 diff_list 列中提取列表,以便该元素占据该列中的单个单元格,并复制其余部分行的。

最佳答案

这是一种策略。考虑df

df = pd.DataFrame(dict(A=list('ab'), B=[1, 2], C=[[1, 2, 3], [4, 5, 6]], ))
df

enter image description here

选项 1
使用set_indexapplyunstack

df.set_index(['A', 'B']).C.apply(pd.Series).stack().reset_index(['A', 'B'], name='C')

选项 2
构建新的索引和数据帧,然后unstack

names = ['A', 'B']
idx = pd.MultiIndex.from_tuples(df[names].values.tolist(), names=names)
pd.DataFrame(df.C.tolist(), idx).stack().reset_index(names, name='C')

enter image description here

关于python - 从 Pandas 单元格中提取列表并使用列表元素作为新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40410416/

相关文章:

python - 异步等待方法在 Python 3 中完成

java - 无限做 while 循环?

loops - 如何在 Elm 中使用循环构建列表?

python - 将不规则列表的单列数据框分解为多列

python - 如何将一个数字的格式复制到另一个数字?

python - 使用 PyQt5 轻松进行多线程,用于更新 QTextBrowser 内容

Java程序: finding smallest and largest number of 3 numbers in an array

python - 从 df 创建一个包含两个特征的新数据框,其中行以一个特征为条件

python - 具有相同列、不同索引级别的算术和对齐 DataFrame

python - 1and1安装python不起作用