将以下pandas数据帧转换为键值对的最佳方法是什么
之前:
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
请注意,我不想在输出中使用datetime键。
答案 0 :(得分:4)
您似乎需要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
答案 1 :(得分:4)
如果您对字典作为输出感到满意,可以使用
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}}
答案 2 :(得分:0)
如果您确实需要输出,则指定一种可能的解决方案是按行遍历数据帧,并通过压缩具有行值的列列表来构造字符串。粗略的版本是:
def create_key_vals(iterable):
str_list = []
for ite in iterable:
str_list.append(ite[0]+"="+ str(ite[1]))
return ','.join(str_list)
new_df = df.drop('datetime', axis=1)
col_list = new_df.columns.tolist()
zipped_col_vals = [zip(col_list, row) for row in new_df.itertuples(index=False, name=False)]
col_value_list = [create_key_vals(ite) for ite in zipped_col_vals]
In [116]: col_value_list
Out[116]:
['name=apple,price=1.0,qty=5',
'name=pear,price=1.5,qty=2',
'name=banana,price=5.0,qty=10']
您可以通过以下方式将其转换为字符串:
In [117]: ('\n').join(col_value_list)
Out[117]: 'name=apple,price=1.0,qty=5\nname=pear,price=1.5,qty=2\nname=banana,price=5.0,qty=10