在 Python 中的列中拆分字符串

Split string in columns in Python

我有一个这样的列表:

[[{'contributionScore': 0.841473400592804, 'variable': 'series_2'},
  {'contributionScore': 0.6113986968994141, 'variable': 'series_3'},
  {'contributionScore': 0.5985525250434875, 'variable': 'series_1'},
  {'contributionScore': 0.5641148686408997, 'variable': 'series_4'},
  {'contributionScore': 0.138543963432312, 'variable': 'series_0'}],

 [{'contributionScore': 1.1316605806350708, 'variable': 'series_1'},
  {'contributionScore': 0.5188271403312683, 'variable': 'series_4'},
  {'contributionScore': 0.38711458444595337, 'variable': 'series_3'},
  {'contributionScore': 0.35055238008499146, 'variable': 'series_0'},
  {'contributionScore': 0.06044715642929077, 'variable': 'series_2'}]]

如何获得每个系列都有一列的数据框?

我想为每个系列获取一个包含 contributionScore 的数据框。

谢谢!

您应该能够使用 pd.DataFrame() 创建数据框。由于列表中的每个元素本身都是数据框,您可以尝试使用列表理解。

假设列表名为“raw_list”:

df = pd.concat([pd.DataFrame(x).pivot_table(columns='variables') for x in raw_list])

这将输出:

   contributionScore  variable
0           0.841473  series_2
1           0.611399  series_3
2           0.598553  series_1
3           0.564115  series_4
4           0.138544  series_0

编辑:

根据 OP 的评论,我们应该首先调整 table,以便:

df = pd.concat([pd.DataFrame(x).pivot_table(columns='variables') for x in raw_list])

输出:

variable           series_0  series_1  series_2  series_3  series_4
contributionScore  0.138544  0.598553  0.841473  0.611399  0.564115
contributionScore  0.350552  1.131661  0.060447  0.387115  0.518827

我对这个说法有点困惑

How can I obtain a dataframe with a column for each series?

如果您指的是单列,对于所有带有“变量”列的系列数据,那么 Celius Stingher 的回答应该足够好。

如果您的意思是将每个系列值作为其自己的单独列, 我将 Celius 的回答扩展为:

##As already stated above
df = pd.concat([pd.DataFrame(x) for x in raw_list])
##To get a sorted list of unique Series values
series_list = sorted(df['variable'].unique())
##We first get a dictionary where each key is the unique series value and each dictionary value is the list of contributionScore unique to that series value. We turn it into a DataFrame in the end
series_df = pd.DataFrame({series : list(df[df['variable'] == series]["contributionScore"]) for series in series_list})

输出看起来像

    series_0    series_1    series_2    series_3    series_4
0   0.138544    0.598553    0.841473    0.611399    0.564115
1   0.350552    1.131661    0.060447    0.387115    0.518827

提醒一下,只有当系列值都具有相同的贡献分数计数时,这才有效。(所有系列在上面各有 2 个贡献分数)

如果每个系列都有不同的贡献分数值,当第三条语句被替换为如下所示的行时,这将起作用:

## We turn each "series" value and their contribution score as DataFrame and concatenate them to accommodate for the varying array lengths of each "series" column.
series_df = pd.concat([pd.DataFrame({series : list(df[df['variable'] == series]["contributionScore"])}) for series in series_list], axis = 1)

示例:如果 series_3 有 3 个贡献分数,它将看起来像这样

    series_0    series_1    series_2    series_3    series_4
0   0.138544    0.598553    0.841473    0.611399    0.564115
1   0.350552    1.131661    0.060447    0.387115    0.518827
2   NaN         NaN         NaN         1.200000    NaN

pd.concat 在这里做的是它允许我们将 pandas 不同列长度的数据帧连接在一起。它用 NaN 填充间隙值。以前仅仅 pd.DataFrame() 是不可能的。 “axis = 1”参数告诉函数将列表中创建的 DataFrame 连接到每个列中“连接”。