【问题标题】:Convert 1 column in df to key and another to values to form a dictionary将 df 中的 1 列转换为键,将另一列转换为值以形成字典
【发布时间】:2020-12-02 18:34:16
【问题描述】:

我有 df:

ClientName   ID             ID2         RoomTypeName    RoomDescription
Emerson     3609           NCGY           STANDARD            A2T
Morningstar 3667           ND8Q           STANDARD        C1D,B1Q,B1K
Morningstar 3668           ND8Q           STANDARD        C1Q,B1Q,B2T
Morningstar 3748           ND8Q           STANDARD          B1Q,STU
Morningstar 3748           ND8Q            DELUXE           SQ1,SK1
McDonalds   3773            NI0           STANDARD            STD
McDonalds   3773            NI0            DELUXE             DLC

我希望最终结果按客户端名称、ID 和 ID2 分组,并有一个映射或字典来为房间类型名称和房间描述创建键值对 所以例如:如果我搜索 id 3748 的豪华房型,它应该会显示 SQ1、SK1。我怎样才能做到这一点? 期望的输出 df:

ClientName   ID             ID2         RoomTypeName    RoomDescription
Emerson     3609           NCGY           STANDARD            [A2T]
Morningstar 3667           ND8Q           STANDARD        [C1D,B1Q,B1K]
Morningstar 3668           ND8Q           STANDARD        [C1Q,B1Q,B2T]
Morningstar 3748           ND8Q       STANDARD,DELUXE   [B1Q,STU][SQ1,SK1]
McDonalds   3773            NI0       STANDARD,DELUXE      [STD],[DLC]

【问题讨论】:

  • 嗨,塔里克。感谢您编辑我的问题。我对堆栈溢出还很陌生,你能告诉我你是如何设法将那个凌乱的表格变成 df 的吗?谢谢
  • 每行前加4个空格。

标签: python dataframe dictionary pandas


【解决方案1】:

与其创建字典,只需将 DataFrame 索引更改为以 ID 和 RoomTypeName 作为键:

df = df.set_index(['ID', 'RoomTypeName'])
result = df.loc[('3748', 'DELUXE')]

【讨论】:

  • 我希望每个 ID 的标准和豪华都在 1 行,因为我需要在之后立即为每一行运行一个 for 循环
  • 然后将 ID 仅用作索引,并通过两次 loc 获取循环中的两行,一次用于豪华,一次用于标准。
  • 如果您告诉我您想要达到的目标,我们可能会找到更好的解决方案。使用 DataFrames 的整个想法是矢量化代码。循环无法达到目的,您可能会转而使用原生 Python 数据结构。
  • 当然,这是自动发送电子邮件警报的一部分。原始 df 是我得到的数据。在每个 id 的电子邮件中,我需要分别写出标准和豪华的所有房间描述。例如:对于 3748:STD:B1Q、STU 和 DLX:SQ1、SK1
  • 好的,那么建议的解决方案应该可以。试试看。
【解决方案2】:
df = yourdf.groupby(['ClientName', 'ID', 'ID2'])

当您这样做时,您的数据框会发生变化,就像分组的值将作为列表元素在单个单元格中一样,现在从中创建字典是一项棘手的工作,它是动态的。这意味着您将在字典中将键作为数组。当您将clientName 分组时,您的一些ID 列值将变为列表。如果你用ID 和RoomDescription 创建一个字典,你不会得到你期望的结果。

【讨论】:

    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多