【问题标题】:How do I get all the unique values from a dataframe attached to the column/s they belong to?如何从附加到它们所属列的数据框中获取所有唯一值?
【发布时间】:2021-08-09 21:02:02
【问题描述】:

我在一家心理健康组织工作,我正在尝试从我们的数据库中提取独特的会话数据。问题如下。有时,当添加新信息(例如,附加签名)时,会添加一个全新的重复信息行,其中包含相同的信息,除了一个新值。我需要与会话(session_id)相关的所有唯一信息。这是一个例子:

import pandas as pd

df = pd.DataFrame({'session_id': [1, 1, 2, 3],
                     'signature': ['Bob', 'John', 'Bob', 'Bob'],
                     'patient_id': [1234, 1234, 1234, 1234],
                     'patient_name': ['Frank', 'Frank', 'Frank', 'Frank']})
df (example created for Jupyter Notebook)

这是我想为每个会话创建的内容:

final_df = pd.DataFrame({'session_id': [1],
                       'signature': ['Bob'],
                       'signature_2':  ['John'],
                       'patient_id': [1234],
                       'patient_name': ['Frank']})
final_df

无论新的唯一值在哪里,我都想要这个输出。因此,如果会话中涉及其他患者,则会为新数据框生成一个名为 patient_name_2 的新列。任何帮助将不胜感激。

或者,如果这可以通过 MS SQL 中某种形式的 GROUP BY 从数据库级别完成,请告诉我。

【问题讨论】:

  • 你的假设是,patient_id 始终是唯一的,session_id 应始终保持最低的 id 并且患者姓名始终相同?
  • 是的,患者 ID 将始终与患者姓名相关联,因此如果涉及其他患者,则 ID 也会更改。

标签: python sql pandas dataframe


【解决方案1】:

我不确定你之后想用它做什么,但一个让你之后相对容易继续工作的快速选择是.groupby.agg

In [89]: df.groupby('session_id').agg(set)
Out[89]:
              signature patient_id patient_name
session_id
1           {John, Bob}     {1234}      {Frank}
2                 {Bob}     {1234}      {Frank}
3                 {Bob}     {1234}      {Frank}

如果您真的想为每个 session_id 创建单独的帧,您也可以只遍历分组的数据帧,而不是使用 .agg

【讨论】:

  • 谢谢,这适用于示例数据集,但不适用于我的真实数据集。我得到一个 InvalidIndexError: Reindexing only valid with unique value Index 对象。不知道为什么。打算再研究一下。
【解决方案2】:

此答案基于您的 final_df。 该解决方案将所有签名加入到一个列表中。

如果你想把一个唯一的签名做成唯一的列,那就有问题了。

示例:不同的患者有不同数量的独特签名。 由于列长度不一致,这将导致您的数据框具有许多 NaN 值。

df_new = df.groupby(by=["patient_id", "patient_name"], as_index=False).agg({"signature":"unique", "session_id": "min"})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多