我有dataframe
,我想drop
函数内的一些行
def IncomeToGo(dataframe, mainCatName):
for k in dataframe.name:
if mainCatName in k:
dataframe= dataframe.drop(dataframe.loc[dataframe.name == k].index)
这就是我使用功能的方式
print(len(df1)) // len = 21
IncomeToGo(df1, 'Apple')
print(len(df1)) // len = 21
但是drop
部分没有做任何事情,也没有从我的dataframe
中删除任何内容
IIUC,有一种方法:
def IncomeToGo(dataframe, mainCatName):
return dataframe[dataframe.name.ne(mainCatName)]
示例:
初始df:
name menu
0 A cheese
1 A cake
2 A sausage
3 B chicken
4 B cake
5 B water
6 C chicken
7 C sausage
8 C water
9 D water
10 D cheese
11 D sausage
df = pd.DataFrame({'name': {0: 'A',
1: 'A',
2: 'A',
3: 'B',
4: 'B',
5: 'B',
6: 'C',
7: 'C',
8: 'C',
9: 'D',
10: 'D',
11: 'D'},
'menu': {0: 'cheese',
1: 'cake',
2: 'sausage',
3: 'chicken',
4: 'cake',
5: 'water',
6: 'chicken',
7: 'sausage',
8: 'water',
9: 'water',
10: 'cheese',
11: 'sausage'}})
def IncomeToGo(dataframe, mainCatName):
return dataframe[dataframe.name.ne(mainCatName)]
IncomeToGo(df, 'A')
输出df:
name menu
3 B chicken
4 B cake
5 B water
6 C chicken
7 C sausage
8 C water
9 D water
10 D cheese
11 D sausage
您的代码中有两个错误:
- 函数不会返回任何内容
- 您可以从正在循环的列中删除行。这是一种非常糟糕的做法
试着过滤掉这些行:
def IncomeToGo(dataframe, mainCatName):
return dataframe[dataframe.name != mainCatName]
如果您想用于列值上的循环,您可以尝试以下方法
def IncomeToGo(dataframe, mainCatName):
for k in dataframe.name.unique():
if mainCatName == k:
dataframe = dataframe.loc[dataframe.name != mainCatName].copy()
return dataframe
我建议不要在函数中对列名进行硬编码。以这样一种方式编写它们,即函数可以在多个位置动态使用。