Pandas 将数据帧转换为键值对

Pandas 将数据帧转换为键值对,pandas,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

将以下数据帧转换为键值对的最佳方法是什么

之前:

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键。

您似乎需要:

但如果不需要键入日期时间:

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
,并添加了旧值。最后一笔:


如果您喜欢使用字典作为输出,那么可以使用

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}}

如果您确实需要指定的输出,一种可能的解决方案是逐行迭代数据帧,并通过压缩列列表和行值来构造字符串。粗略的版本是:

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

你的答案中有
pd.read_clipboard()
,答案本身就很粗略。但更重要的是,它是不正确的,因为您错过了时间戳的前半部分,这一点可以从以下事实得到证明:您只将输出中的时间分量显示为字符串。这正是
read_clipboard
所做的解析错误,我指的是。但是,这不会改变任何必要的行为。2017-11-01 10:20 name='apple',qty='5',price='1.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