【问题标题】:How can I iterate over column values in Pandas and create a new observation based on the values of multiple columns in the same row?如何迭代 Pandas 中的列值并根据同一行中多个列的值创建新观察值?
【发布时间】:2020-10-18 05:44:53
【问题描述】:

所以发布了这个问题的许多变体,但它们都不是我正在寻找的。​​p>

我有一个数据集,其中包含多个包含布尔值的列,这些值指示用户是否在其居住地列出了城市名称。用户可以命名多个城市名称。见下文。

日期集示例:

+----+----------+-------+-------------+------------------------------------+
| ID | New York |  LA   | New Orleans |              New Var               |
+----+----------+-------+-------------+------------------------------------+
|  1 | True     | False | True        | 'New York, NY', 'New Orleans, LA'  |
|  2 | True     | False | False       | 'New York, NY                      |
|  3 | False    | False | False       | 'None'                             |
+----+----------+-------+-------------+------------------------------------+

我要做的是创建一个新列,用于存储用户列出的所有城市名称的文本名称。我可以用一百万个嵌套的 if 条件来做到这一点,但我确信在 Pandas 中有更好的方法来做到这一点。谁能指出我正确的方向?

数据集图片链接:

【问题讨论】:

  • 用户 ID 列在哪里?
  • 每一行都有一个唯一的用户 ID 值。我已经编辑了我的示例以反映这一点。
  • 当然。新列“New Var”是我想要得到的输出。

标签: python pandas data-analysis data-manipulation


【解决方案1】:

您可以将布尔值乘以字符串,并且由于 pandas 的 sum() 函数连接字符串,您可以获取数据和列值的点积。两者都做,你可以这样做:

df = pd.DataFrame({'NY':[True, True, False],'SF':[True, False, True]})

delimiter = ", "
tmp= df.rename(columns=lambda x: x+delimiter)
df['Cities'] = tmp.dot(tmp.columns).str[:-len(delimiter)]
df


#~        NY     SF  Cities
#~  0   True   True  NY, SF
#~  1   True  False      NY
#~  2  False   True      SF

如果您的某些列是城市名称,您可以列出城市列并使用它们:

cities = ['NY','SF']
tmp= df[cities].rename(columns=lambda x: x+delimiter)

【讨论】:

    【解决方案2】:

    IIUC,如果您的值确实是真正的布尔值,您可以使用 np.wheredf.dot

    import numpy as np
    
    #to keep the peformance of numpy arrays i would suggest doing
    #df.columns = df.columns.map(lambda x : f'{x},')
    df['places'] = df.dot(df.columns)
    
    
         New York     LA  New Orleans               places
    ID                                                    
    1.0      True  False         True  New YorkNew Orleans
    2.0      True  False        False             New York
    3.0     False  False        False                     
    

    或使用 numpy。

    df['places_2'] = np.where(df, df.columns, '').sum(axis=1)
    
         New York     LA  New Orleans             places_2
    ID                                                    
    1.0      True  False         True  New YorkNew Orleans
    2.0      True  False        False             New York
    3.0     False  False        False                     
    

    【讨论】:

      猜你喜欢
      • 2020-12-22
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      • 2019-10-15
      • 2021-07-08
      相关资源
      最近更新 更多