如何将表结构数据转换为python/pandas中的dict/graph结构,用于D3中的force图?

2024-10-06 10:25:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在转换这个csv:

"","Destination","Source"
"1","New York","Chicago"
"2","Denver","Chicago"
"3","Los Angeles","Boston"
"4","Colorado","Indianapolis"

格式如下:

[
    {
        "name": "Chicago",
        "target": [
            1,
            2
        ]
    },
    {
        "name": "New York",
        "target": []
    },
    {
        "name": "Denver",
        "target": []
    },
    {
        "name": "Los Angeles",
        "target": []
    },
    {
        "name": "Boston",
        "target": [
            3
        ]
    },
    {
        "name": "Indianapolis",
        "target": [
            6
        ]
    },
    {
        "name": "Colorado",
        "target": []
    }
]

其中target是其连接到的节点的索引号。你知道吗

我试着用python来做这件事,因为我想把这些数据发布到DB中,然后从前端拉出来做D3的事情。你知道吗

我也试过用熊猫,但不能用这种格式。现在很沮丧!任何帮助都将不胜感激!!你知道吗

谢谢你!你知道吗


Tags: csvnamesourcetargetnew格式bostondestination
2条回答

您可以使用^{},但在需要创建适当的df之前:

df['nan'] = 'none'
df['Source'] = df.Source.astype(str)

df.reset_index(inplace=True)

df = pd.lreshape(df, {'target': ['index', 'nan'], 'name': ['Destination', 'Source']})
print (df)
  target          name
0      1       Chicago
1      2       Chicago
2      3        Boston
3      4  Indianapolis
4   none      New York
5   none        Denver
6   none   Los Angeles
7   none      Colorado

df1 = df.groupby('name')['target']
        .apply(lambda x: [] if (x == 'none').all() else x.tolist())
        .reset_index(name='target'))

print (df1)
           name  target
0        Boston     [3]
1       Chicago  [1, 2]
2      Colorado      []
3        Denver      []
4  Indianapolis     [4]
5   Los Angeles      []
6      New York      []
print (df1.to_dict(orient='records'))
[{'name': 'Boston', 'target': [3]}, 
 {'name': 'Chicago', 'target': [1, 2]}, 
 {'name': 'Colorado', 'target': []}, 
 {'name': 'Denver', 'target': []}, 
 {'name': 'Indianapolis', 'target': [4]},
 {'name': 'Los Angeles', 'target': []}, 
 {'name': 'New York', 'target': []}]

检查这是否符合你的要求

import csv
reader=csv.reader(open("data.csv","rb"))
next(reader)
x,y={},set()
for r in reader:
    a,b,c=r
    x.update({a:c})
    y.update([b,c])

anss =dict((new_key,[k for k,v in x.iteritems() if new_key==v]) for new_key in y)
result=[{"name":k,"target":v} for k,v in anss.iteritems()]

相关问题 更多 >