我有一个像这样的数据框
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 包含每个产品的所有信息,按列表中是否存在列值排序...
你不需要
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
我创建了一些示例数据。不要循环遍历行,而是创建所需行的掩码,您可以使用它来获取这些行,然后使用波形符 ~ 运算符“不是那些”。
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]