【问题标题】:creating a new dataframe based off if a particular value matches a value in a list如果特定值与列表中的值匹配,则创建一个新的数据框
【发布时间】:2015-01-29 17:08:49
【问题描述】:

我拥有的是熊猫数据框中的数据。有一列包含 customer_id。这些不是唯一的 ID。我有一个选定客户 ID 的列表(列表中没有重复值)。我想要做的是根据列表中的 id 创建一个新的数据框。我想要列表中每个 id 的所有行。所有数据都以str的形式读入。
这是我的代码:

for i in range(len(df_ALL)):
if df_ALL.loc[i,"Customer_ID"] in ID_list:
    df_Sub = df_Sub.append(df_ALL.iloc[i,:])

当我在简单的小文件上运行它时,它会运行。但是,当我在真实数据上运行它时,它返回一个“KeyError:'标签 [2666] 不在 [index]'”我只使用 python/pandas 大约 4-5 个月,我试图研究解决这个问题,但我找不到我理解的东西。如果有更好的方法来实现我的目标,我愿意学习。

提前谢谢你。

【问题讨论】:

  • 您能否发布可重现您的错误的示例数据和代码,听起来您正在尝试为列表中的所有客户创建一个新的 df 是否正确? df[df['Customer_ID'].isin(ID_list)] 怎么样?我相信应该可以工作
  • @EdChum 你是对的!这正是我想做的。我按照你的建议使用了isin,它奏效了。

标签: python pandas merge filtering dataframe


【解决方案1】:

由于您尚未发布任何数据或代码,我将演示以下内容应如何为您工作。您可以将列表传递给isin,它将返回一个布尔索引,您可以使用它来过滤您的df,无需循环并附加感兴趣的行。它可能对你来说是失败的(我猜是因为我没有你的数据),因为你要么结束了,要么你的索引不包含那个特定的标签值。

In [147]:

customer_list=['Microsoft', 'Google', 'Facebook']
df = pd.DataFrame({'Customer':['Microsoft', 'Microsoft', 'Google', 'Facebook','Google', 'Facebook', 'Apple','Apple'], 'data':np.random.randn(8)})
df
Out[147]:
    Customer      data
0  Microsoft  0.669051
1  Microsoft  0.392646
2     Google  1.534285
3   Facebook -1.204585
4     Google  1.050301
5   Facebook  0.492487
6      Apple  1.471614
7      Apple  0.762598
In [148]:

df['Customer'].isin(customer_list)
Out[148]:
0     True
1     True
2     True
3     True
4     True
5     True
6    False
7    False
Name: Customer, dtype: bool
In [149]:

df[df['Customer'].isin(customer_list)]
Out[149]:
    Customer      data
0  Microsoft  0.669051
1  Microsoft  0.392646
2     Google  1.534285
3   Facebook -1.204585
4     Google  1.050301
5   Facebook  0.492487

【讨论】:

  • 从“customer_list”列表中创建第二个 pandas 数据框然后执行 SQL 类型合并会更有效吗?
  • @Knop 一个 dict 或 df 就可以了
猜你喜欢
  • 2022-07-29
  • 2021-02-22
  • 1970-01-01
  • 2019-03-18
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
相关资源
最近更新 更多