pandas 根据上方某行中的值删除重复行

8cdiaqws  于 2023-02-11  发布在  其他
关注(0)|答案(4)|浏览(132)

下面是我的dataframe的一个示例:

df = pd.DataFrame([['In', 'Age', 'Nat.'],
                   ['Jakub Kiwior', 22, 'Poland'],
                   ['Leandro Trossard', 28, 'Belgium'],
                   ['Jorginho', 31, 'Italy'],
                   ['Out', 'Age', 'Nat.'],
                   ['Jhon Durán', 19, 'Colombia'],
                   ['In', 'Age', 'Nat.'],
                   ['Jhon Durán', 19, 'Colombia'],
                   ['Álex Moreno', 29, 'Spain'],
                   ['Out', 'Age', 'Nat.'],
                   ['Leandro Trossard', 28, 'Belgium'],
                   ['Jorginho', 31, 'Italy'],
                   ['In', 'Age', 'Nat.'],
                   ['Out', 'Age', 'Nat.'],
                   ['In', 'Age', 'Nat.'],
                  ], columns=['Player', 'Age', 'Nat.'])

我的desired output是一个 Dataframe ,如果上面的行(不一定是直接在上面)在“Player”列中的值为“Out”,则删除重复行。
例如,期望的输出将移除第一“JhonDurán”行,以及第二“LeandroTrossard”和“Jorginho”行,因为这些行上面是“Out”而不是“In”.
这在Pandas身上可能实现吗?

nr9pn0ug

nr9pn0ug1#

使用布尔索引:

# keep rows that are after In and drop those after Out
m1 = df['Player'].map({'In': True, 'Out': False}).ffill()
# keep rows with In/Out
m2 = df['Player'].isin(['In', 'Out'])

out = df.loc[m1|m2]

输出:

Player  Age      Nat.
0                 In  Age      Nat.
1       Jakub Kiwior   22    Poland
2   Leandro Trossard   28   Belgium
3           Jorginho   31     Italy
4                Out  Age      Nat.
6                 In  Age      Nat.
7         Jhon Durán   19  Colombia
8        Álex Moreno   29     Spain
9                Out  Age      Nat.
12                In  Age      Nat.
13               Out  Age      Nat.
14                In  Age      Nat.
c3frrgcw

c3frrgcw2#

你可以使用Pandas转移方法来帮助实现这一点。

df['previousPlayer'] = df['Player'].shift(1)
df

                 Player  Age      Nat.    previousPlayer
0                 In  Age      Nat.               NaN
1       Jakub Kiwior   22    Poland                In
2   Leandro Trossard   28   Belgium      Jakub Kiwior
3           Jorginho   31     Italy  Leandro Trossard
4                Out  Age      Nat.          Jorginho
5         Jhon Durán   19  Colombia               Out
6                 In  Age      Nat.        Jhon Durán
7         Jhon Durán   19  Colombia                In
8        Álex Moreno   29     Spain        Jhon Durán
9                Out  Age      Nat.       Álex Moreno
10  Leandro Trossard   28   Belgium               Out
11          Jorginho   31     Italy  Leandro Trossard
12                In  Age      Nat.          Jorginho
13               Out  Age      Nat.                In
14                In  Age      Nat.               Out

然后,只需使用您选择的单词过滤掉新列中的任何值:

df = df[df.previousPlayer != 'Out'].drop('previousPlayer', axis=1)
print(df)

              Player  Age      Nat.
0                 In  Age      Nat.
1       Jakub Kiwior   22    Poland
2   Leandro Trossard   28   Belgium
3           Jorginho   31     Italy
4                Out  Age      Nat.
6                 In  Age      Nat.
7         Jhon Durán   19  Colombia
8        Álex Moreno   29     Spain
9                Out  Age      Nat.
11          Jorginho   31     Italy
12                In  Age      Nat.
13               Out  Age      Nat.
guicsvcw

guicsvcw3#

增加一个额外的列"out/in"或者其他的方式来存储你的数据会更有好处。如果我们看一下标题"player",它应该只有player在里面;"out"或"in"不是该列的相关数据条目。确保创建干净且易于操作的数据非常重要。
一旦我们添加了一个新的列"出局/入局",我们就可以轻松地更改球员的状态并丢弃出局的球员。
下面是上面应用的。注意添加的status列:

df = pd.DataFrame([['Jakub Kiwior', 22, 'Poland','in'],
                   ['Leandro Trossard', 28, 'Belgium','in'],
                   ['Jorginho', 31, 'Italy','in'],
                   ['Jhon Durán', 19, 'Colombia', 'out'],
                   ['Álex Moreno', 29, 'Spain','in'],
                   ['Leandro Trossard', 28, 'Belgium', 'out'],
                   ['Jorginho', 31, 'Italy','in'],
                  ], columns=['Player', 'Age', 'Nat.', 'status'])

以下是原始数据框:

如果我们想将播放器从in更改为out

player_name = 'Leandro Trossard'
df.loc[df['Player'] == player_name, 'status'] = 'out'

这就给了我们:

如果我们想删除 Dataframe 中的所有球员:

in_players_df = df[df['status']!='out']

这就给了我们:

这将创建一个新的df,其中只有"in"玩家。这允许我们访问一个过滤视图(in_players_df),以及一个所有玩家的视图(df),而不考虑in/out。如果我们使用df=...,它将更改原始 Dataframe 。这取决于您的目标:)

1szpjjfi

1szpjjfi4#

我相信这就是你要找的:

df.loc[df['Player'].isin(['In','Out']).cumsum().mod(2).eq(1) | df['Player'].eq('Out')]

输出:

Player  Age      Nat.
0                 In  Age      Nat.
1       Jakub Kiwior   22    Poland
2   Leandro Trossard   28   Belgium
3           Jorginho   31     Italy
4                Out  Age      Nat.
6                 In  Age      Nat.
7         Jhon Durán   19  Colombia
8        Álex Moreno   29     Spain
9                Out  Age      Nat.
12                In  Age      Nat.
13               Out  Age      Nat.
14                In  Age      Nat.

相关问题