2017-04-03 143 views
2

什么是以下大熊猫数据帧转换为一个键值对的最佳方式大熊猫据帧到键值对

前:

datetime    name qty  price 
2017-11-01 10:20  apple 5  1 
2017-11-01 11:20  pear  2  1.5 
2017-11-01 13:20  banana 10  5 

后:

2017-11-01 10:20 name=apple qty=5 price=1 
2017-11-01 11:20 name=pear qty=2 price=1.5 
2017-11-01 13:20 name=banana qty=10 price=5 

注意,我不在我的输出中不需要日期时间键。

回答

2

看来你需要to_dict

d = df.drop('datetime', axis=1).to_dict(orient='records') 
print (d) 
[{'qty': 5, 'price': 1.0, 'name': 'apple'}, 
{'qty': 2, 'price': 1.5, 'name': 'pear'}, 
{'qty': 10, 'price': 5.0, 'name': 'banana'}] 

但如果不用钥匙datetime

d = df.set_index('datetime').to_dict(orient='index') 
print (d) 
{'2017-11-01 13:20': {'qty': 10, 'price': 5.0, 'name': 'banana'}, 
'2017-11-01 10:20': {'qty': 5, 'price': 1.0, 'name': 'apple'}, 
'2017-11-01 11:20': {'qty': 2, 'price': 1.5, 'name': 'pear'}} 

如果顺序很重要:

tuples = [tup for tup in df.set_index('datetime').itertuples()] 
print (tuples) 

[Pandas(Index='2017-11-01 10:20', name='apple', qty=5, price=1.0), 
Pandas(Index='2017-11-01 11:20', name='pear', qty=2, price=1.5), 
Pandas(Index='2017-11-01 13:20', name='banana', qty=10, price=5.0)] 

编辑:

使用列名创建新的DataFrame并添加了旧值。最后写to_csv

df = df.set_index('datetime').astype(str) 
df1 = pd.DataFrame(np.tile(np.array(df.columns), len(df.index)).reshape(len(df.index), -1), 
        index=df.index, 
        columns=df.columns) + '=' 
df1 = df1.add(df) 
print (df1) 
         name  qty  price 
datetime           
2017-11-01 10:20 name=apple qty=5 price=1.0 
2017-11-01 11:20 name=pear qty=2 price=1.5 
2017-11-01 13:20 name=banana qty=10 price=5.0 

df1.to_csv('filename.csv', header=None) 

2017-11-01 10:20,name=apple,qty=5,price=1.0 
2017-11-01 11:20,name=pear,qty=2,price=1.5 
2017-11-01 13:20,name=banana,qty=10,price=5.0 
+0

2017年11月1日10:20名称=“苹果”,数量=“5”,价格=“1.0”。我不介意这种格式转储到一个文件中的数据。 – Sun

+0

好吧,给我一下 – jezrael

+0

请检查编辑答案。 – jezrael

3

如果你是幸福的一本字典作为输出,你可以使用

df.to_dict('index') 

在您的例子(与由read_clipboard日期略有解析错误),这将导致:

In [17]: df = pd.read_clipboard().reset_index(drop=True) 

In [18]: df.to_dict('index') 
Out[18]: 
{0: {'datetime': '10:20', 'name': 'apple', 'price': 1.0, 'qty': 5}, 
1: {'datetime': '11:20', 'name': 'pear', 'price': 1.5, 'qty': 2}, 
2: {'datetime': '13:20', 'name': 'banana', 'price': 5.0, 'qty': 10}} 
+0

你有'pd.read_clipboard()'作为你自己答案的一部分。但更重要的是,这是不正确的,因为你错过了前半部分的时间戳,这是由于你只在你的输出中将时间分量显示为一个字符串。 – piRSquared

+0

这就是'read_clipboard'确实存在的解析错误,我所指的就是这样。但是,这并不会改变任何所需的行为。 – languitar