Pandas - 将 DF 列转换为索引但不重复
Pandas - turning a DF column into an Index but without duplication
如果我有一个像这样的 pandas 数据框,我想将 'pol_class' 列变成索引,但只有这样它才不会重复(pol_class 有 3 个值:负面、中性、正面),我最好怎么做?
我正在尝试将其转换为一种格式,以便我可以调用 pandas' .to_json(orient = 'index') 格式最终将其转换为这种格式 JSON 格式...(我将删除 'time_by_min' 列并仅使用其他两个非 pol_class 列)
[{
"key" : "Negative" ,
"values" : [ [ 1439489400000, 4] , [ 1439489460000, 8],
[ 1439489520000, 5],
...]
},
{
"key" : "Neutral" ,
"values" : [ [ 1439489400000, 0] , [ 1439489460000, 4],
[ 1439489520000, 15],
...]
},
{
"key" : "Positive" ,
"values" : [ [ 1439489400000, 6] , [ 1439489460000, 14],
[ 1439489520000, 12],
...]
}]
首先,让我们从字典列表中重现您的 DataFrame。 (下次您可以发帖 df.to_dict('split'))
:
来帮助我们
import json
import numpy as np
import pandas as pd
data = [
{ "key" : "Negative" ,
"values" : [ [ 1439489400000, 4] , [ 1439489460000, 8],
[ 1439489520000, 5], ]},
{ "key" : "Neutral" ,
"values" : [ [ 1439489400000, 0] , [ 1439489460000, 4],
[ 1439489520000, 15], ]},
{ "key" : "Positive" ,
"values" : [ [ 1439489400000, 6] , [ 1439489460000, 14],
[ 1439489520000, 12], ]}]
df = pd.concat({ dct['key']:pd.DataFrame(dct['values']) for dct in data})
df.index = df.index.droplevel(level=1)
df.index.names = ['A']
df.columns=['B', 'C']
df = df.reset_index()
# A B C
# 0 Negative 1439489400000 4
# 1 Negative 1439489460000 8
# 2 Negative 1439489520000 5
# 3 Neutral 1439489400000 0
# 4 Neutral 1439489460000 4
# 5 Neutral 1439489520000 15
# 6 Positive 1439489400000 6
# 7 Positive 1439489460000 14
# 8 Positive 1439489520000 12
现在我们可以从 DataFrame 重新生成字典列表:
newdata = [{'key':key, 'values': grp[['B','C']].values.tolist()}
for key, grp in df.groupby('A')]
想要的JSON可以调用json.dumps
:
得到
print(json.dumps(newdata))
产量
[{"values": [[1439489400000, 4], [1439489460000, 8], [1439489520000, 5]], "key": "Negative"}, {"values": [[1439489400000, 0], [1439489460000, 4], [1439489520000, 15]], "key": "Neutral"}, {"values": [[1439489400000, 6], [1439489460000, 14], [1439489520000, 12]], "key": "Positive"}]
只有一个方向使 df.to_dict
return 成为字典列表:
df.to_dict(orient='records')
。每个字典的键是列名。您的
所需的字典列表包含键始终为 'values'
和
'keys'
。所以如果我们想使用 df.to_dict
我们需要操纵
将 DataFrame 合并为一个只有两列的 'keys'
和
'values'
...呸,工作量太大了。只表达想要的列表更容易
字典作为列表理解,如上所示。
如果我有一个像这样的 pandas 数据框,我想将 'pol_class' 列变成索引,但只有这样它才不会重复(pol_class 有 3 个值:负面、中性、正面),我最好怎么做?
我正在尝试将其转换为一种格式,以便我可以调用 pandas' .to_json(orient = 'index') 格式最终将其转换为这种格式 JSON 格式...(我将删除 'time_by_min' 列并仅使用其他两个非 pol_class 列)
[{
"key" : "Negative" ,
"values" : [ [ 1439489400000, 4] , [ 1439489460000, 8],
[ 1439489520000, 5],
...]
},
{
"key" : "Neutral" ,
"values" : [ [ 1439489400000, 0] , [ 1439489460000, 4],
[ 1439489520000, 15],
...]
},
{
"key" : "Positive" ,
"values" : [ [ 1439489400000, 6] , [ 1439489460000, 14],
[ 1439489520000, 12],
...]
}]
首先,让我们从字典列表中重现您的 DataFrame。 (下次您可以发帖 df.to_dict('split'))
:
import json
import numpy as np
import pandas as pd
data = [
{ "key" : "Negative" ,
"values" : [ [ 1439489400000, 4] , [ 1439489460000, 8],
[ 1439489520000, 5], ]},
{ "key" : "Neutral" ,
"values" : [ [ 1439489400000, 0] , [ 1439489460000, 4],
[ 1439489520000, 15], ]},
{ "key" : "Positive" ,
"values" : [ [ 1439489400000, 6] , [ 1439489460000, 14],
[ 1439489520000, 12], ]}]
df = pd.concat({ dct['key']:pd.DataFrame(dct['values']) for dct in data})
df.index = df.index.droplevel(level=1)
df.index.names = ['A']
df.columns=['B', 'C']
df = df.reset_index()
# A B C
# 0 Negative 1439489400000 4
# 1 Negative 1439489460000 8
# 2 Negative 1439489520000 5
# 3 Neutral 1439489400000 0
# 4 Neutral 1439489460000 4
# 5 Neutral 1439489520000 15
# 6 Positive 1439489400000 6
# 7 Positive 1439489460000 14
# 8 Positive 1439489520000 12
现在我们可以从 DataFrame 重新生成字典列表:
newdata = [{'key':key, 'values': grp[['B','C']].values.tolist()}
for key, grp in df.groupby('A')]
想要的JSON可以调用json.dumps
:
print(json.dumps(newdata))
产量
[{"values": [[1439489400000, 4], [1439489460000, 8], [1439489520000, 5]], "key": "Negative"}, {"values": [[1439489400000, 0], [1439489460000, 4], [1439489520000, 15]], "key": "Neutral"}, {"values": [[1439489400000, 6], [1439489460000, 14], [1439489520000, 12]], "key": "Positive"}]
只有一个方向使 df.to_dict
return 成为字典列表:
df.to_dict(orient='records')
。每个字典的键是列名。您的
所需的字典列表包含键始终为 'values'
和
'keys'
。所以如果我们想使用 df.to_dict
我们需要操纵
将 DataFrame 合并为一个只有两列的 'keys'
和
'values'
...呸,工作量太大了。只表达想要的列表更容易
字典作为列表理解,如上所示。