如何创建子数据框,如果列表中包含某些列值则附加行?

问题描述 投票:0回答:2

我有一个像这样的数据框

Data = pd.read_csv('info_com.csv')
df1 = pd.DataFrame(Data)

这个DF有一栏“Code”,包含了所有的产品代码,DF几乎包含了该产品的所有信息。所以,我有一个包含感兴趣代码的列表,但实际上,我需要两个 df,一个包含“好代码”行,一个包含坏代码。

我尝试做某种排序和循环

   ComDF1 = df1['Codes']
   goodCodes = ['B0CD3589HR' ... 'B0CD726Q8T']


  for i in range(len(ComDF1)):
     if ComDF1[i] in goodCodes:
       df1.iloc[i].append(dfWP)
     else:
       df1.iloc[i].append(dfNWP)

  print(dfWP, dfNWP)

并期望两个 DF 包含每个产品的所有信息,按列表中是否存在列值排序...

python pandas dataframe loops sorting
2个回答
0
投票

你不需要

for
循环,但是

df_wp = df[ df['Codes'].isin(good_codes) ]

~
相同以反转选择

df_nwp = df[ ~df['Codes'].isin(good_codes) ]

或仅使用

isin
一次

mask = df['Codes'].isin(good_codes)

df_wp  = df[ mask]
df_nwp = df[~mask]

带有示例数据的最少工作代码

df = pd.DataFrame({
    'Codes': ['B0CD3589HR', 'wrong', 'B0CD726Q8T', 'blablabla' ],
    'Other': [12, 23, 34, 45],
})

good_codes = ['B0CD3589HR', 'B0CD726Q8T']   # PEP8: `lower_case_names` for variables

mask = df['Codes'].isin(good_codes)

df_wp  = df[ mask]
df_nwp = df[~mask]

print('--- mask ---')
print(mask)

print('--- df_wp ---')
print(df_wp)

print('--- df_nwp ---')
print(df_nwp)

结果:

--- mask ---
0     True
1    False
2     True
3    False
Name: Codes, dtype: bool
--- df_wp ---
        Codes  Other
0  B0CD3589HR     12
2  B0CD726Q8T     34
--- df_nwp ---
       Codes  Other
1      wrong     23
3  blablabla     45

0
投票

我创建了一些示例数据。不要循环遍历行,而是创建所需行的掩码,您可以使用它来获取这些行,然后使用波形符 ~ 运算符“不是那些”。

import pandas as pd

example_data = [{'Codes': 'B0CD3589HR', 'other_data': '8675309'}, {'Codes': 'B0CD726Q8T', 'other_data': 'spam'},
                {'Codes': 'sdbadcodesdk', 'other_data': 'eggs'}, {'Codes': 'klbadzoot4d', 'other_data': 'a herring'},
                {'Codes': 'B0CD3589HR', 'other_data': 'a shrubbery'}, {'Codes': 'B0CD726Q8T', 'other_data': 'ni'}]

df1 = pd.DataFrame.from_records(example_data)

goodCodes = ['B0CD3589HR', 'B0CD726Q8T']

good_code_rows_mask = df1['Codes'].isin(goodCodes)

good_codes_df = df1.loc[good_code_rows_mask]
not_good_codes_df = df1.loc[~good_code_rows_mask]
© www.soinside.com 2019 - 2024. All rights reserved.