在 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 连接到每个列中“连接”。
我有一个这样的列表:
[[{'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 连接到每个列中“连接”。