假设我在 pandas DataFrame 中有三列,没有任何 null 或空值。
- 每个项目的设施始终具有唯一的值。
- 一个项目可以有一个或多个与其关联的供应商。
- 同一供应商可以显示对于给定项目的不同设施,多次注册。
- 对于给定项目,设施永远不会与多个供应商关联。
- 项目值是有序的。
- 每一行都是唯一的。
示例数据的:
列供应商 | 列项目 | 列设施 |
---|---|---|
V1 | I1 | F1 |
V1 | I1 | F2 |
V2 | I1 | F4 |
V1 | I2 | F1 |
V1 | I2 | F2 |
V2 | I2 | F3 |
V3 | I2| ||F5 | V3 |
I2 | F6 | V3 |
I3 | F3 | V1 |
I4 | F2 | V4 |
I4 | F4 | V4 |
I4 | F5 | V1 |
I5 | F1 | V1 |
I5 | F4 | 如何创建包含以下内容的 DataFrame ?:“对于每一项,如果有多个供应商与该项目关联,请给我该项目的所有行(否则排除与该项目关联的所有行)。” |
在这个示例中,我想要一个 DataFrame I1、I2 和 I4 的所有行,因为它们有多个与它们关联的唯一供应商,并且我将排除涉及 I3 和 I5 的所有行,因为只有一个供应商与它们关联。
我尝试创建一个每个项目的唯一供应商列表以
为条件循环,但到目前为止还没有运气。
len(Appended_Vendor_List_var) > 1
, but so far no luck.
import pandas as pd
# 示例数据
data = {'供应商': ['V1', 'V1', 'V2', 'V1', 'V1', 'V2', 'V3', 'V3', 'V1', 'V4', 'V4', 'V1', 'V1', 'V1'],
'项目': ['I1', 'I1', 'I1', 'I2', 'I2', 'I2', 'I2', 'I3', 'I4', 'I4', 'I4', 'I5', 'I5'],
'设施': ['F1', 'F2', 'F4', 'F1', 'F2', 'F3', 'F5', 'F6', 'F3', 'F2', 'F4', 'F5', 'F1']}
df = pd.DataFrame(data)
# 按项目分组并获取供应商计数
vendor_counts = df.groupby('项目')['供应商'].nunique()
# 筛选具有多个供应商的项目
projects_with_multiple_vendors = vendor_counts[vendor_counts > 1].index
# 从原始 DataFrame 中筛选出所选项目的行
result_df = df[df['项目'].isin(projects_with_multiple_vendors)]
print(result_df)
这首先使用
groupby
和
nunique
创建每个项目中唯一供应商的计数。然后,它使用布尔索引选择具有多个供应商的项目。最后,它使用
isin
方法仅过滤原始 DataFrame 中属于这些项目的行。
此代码将返回所请求的 DataFrame,其中包含来自原始 DataFrame 中的 I1、I2 和 I4 的所有行,因为这些项目具有多个与之关联的唯一供应商。
标签:python,pandas,dataframe,conditional-statements From: 79019661