python数据帧:删除选定行
我有一个熊猫数据框,类似于:python数据帧:删除选定行,python,pandas,Python,Pandas,我有一个熊猫数据框,类似于: df = pd.read_csv('fruit.csv') print(df) fruitname quant 0 apple 10 1 apple 11 2 apple 13 3 banana 10 4 banana 20 5 banana 30 6 banana 40 7 pear 10 8 pear
df = pd.read_csv('fruit.csv')
print(df)
fruitname quant
0 apple 10
1 apple 11
2 apple 13
3 banana 10
4 banana 20
5 banana 30
6 banana 40
7 pear 10
8 pear 102
9 pear 1033
10 pear 1012
11 pear 101
12 pear 100
13 pear 1044
14 orange 10
如果每个水果有奇数(不均匀)个数的条目(%2==1),我想删除最后一个条目(每个水果)。无需在数据帧中循环。因此,上述的最终结果将是:
--移除最后一个苹果,因为苹果出现了3次
--去掉最后一个梨
--去掉最后一个(唯一的)橙色
导致:
fruitname quant
0 apple 10
1 apple 11
2 banana 10
3 banana 20
4 banana 30
5 banana 40
6 pear 10
7 pear 102
8 pear 1033
9 pear 1012
10 pear 101
11 pear 100
这可能吗?还是我必须通过DF循环?我已经在谷歌上搜索了4天,只是不知道怎么做。确定每个水果使用的项目数量,并根据是否有奇数建立一个列表。 我们可以通过使用
%
模运算符生成1
或0
来实现这一点,使用该运算符来创建布尔掩码
使用布尔掩码来屏蔽值\u计数的索引
现在您有了一个水果列表,通过过滤df迭代每个水果,并使用and.name
属性获取最后一个索引标签,并将其附加到列表中
现在,列表中有以下标签:
In [393]:
fruits = df['fruitname'].value_counts().index[(df['fruitname'].value_counts() % 2).astype(bool)]
idx = []
for fruit in fruits:
idx.append(df[df['fruitname']==fruit].iloc[-1].name)
df.drop(idx)
Out[393]:
fruitname quant
0 apple 10
1 apple 11
3 banana 10
4 banana 20
5 banana 30
6 banana 40
7 pear 10
8 pear 102
9 pear 1033
10 pear 1012
11 pear 101
12 pear 100
分解上述内容:
In [394]:
df['fruitname'].value_counts()
Out[394]:
pear 7
banana 4
apple 3
orange 1
Name: fruitname, dtype: int64
In [398]:
df['fruitname'].value_counts() % 2
Out[398]:
pear 1
banana 0
apple 1
orange 1
Name: fruitname, dtype: int64
In [399]:
fruits = df['fruitname'].value_counts().index[(df['fruitname'].value_counts() % 2).astype(bool)]
fruits
Out[399]:
Index(['pear', 'apple', 'orange'], dtype='object')
In [401]:
for fruit in fruits:
print(df[df['fruitname']==fruit].iloc[-1].name)
13
2
14
实际上,您可以使用而不是iloc[-1].name
,这样以下操作就可以了:
fruits = df['fruitname'].value_counts().index[(df['fruitname'].value_counts() % 2).astype(bool)]
idx = []
for fruit in fruits:
idx.append(df[df['fruitname']==fruit].last_valid_index())
df.drop(idx)
我对熊猫不是很熟悉,但这里有一个答案
for fruit in pd.unique(df.fruitname):
df1=df[df.fruitname==fruit]
if len(df1)%2 == 1:
df=df.drop(df1.last_valid_index())
EdChum的另一种方法是使用
groupby
:
>>> grouped = df.groupby("fruitname")["fruitname"]
>>> lengths = grouped.transform(len)
>>> df.loc[~((lengths % 2 == 1) & (grouped.cumcount() == lengths-1))]
fruitname quant
0 apple 10
1 apple 11
3 banana 10
4 banana 20
5 banana 30
6 banana 40
7 pear 10
8 pear 102
9 pear 1033
10 pear 1012
11 pear 101
12 pear 100
这是通过使用
transform
(和cumcount
,其行为类似于一种转换类型,因为它会广播到原始索引),为我们提供一个可以使用的帧长度序列:
>>> lengths
0 3
1 3
2 3
3 4
4 4
5 4
6 4
7 7
8 7
9 7
10 7
11 7
12 7
13 7
14 1
Name: fruitname, dtype: object
>>> grouped.cumcount()
0 0
1 1
2 2
3 0
4 1
5 2
6 3
7 0
8 1
9 2
10 3
11 4
12 5
13 6
14 0
dtype: int64
您可以使用应用功能:
def remove_last_odd_row(fr):
nrow = fr.shape[0]
if nrow % 2 > 0:
return fr[:(nrow - 1)]
else:
return fr
fr = fr.groupby("fruitname").apply(remove_last_odd_row).reset_index(drop=True)
你很狡猾;)+1.