Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python数据帧:删除选定行_Python_Pandas - Fatal编程技术网

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.