Ich habe einen Pandas DataFrame
wie folgt.
df = pd.DataFrame({'id' : [1,1,1,2,2,3,3,3,3,4,4,5,6,6,6,7,7],
'value' : ["first","second","second","first",
"second","first","third","fourth",
"fifth","second","fifth","first",
"first","second","third","fourth","fifth"]})
Ich möchte dies nach ["id", "value"] gruppieren und die erste Zeile jeder Gruppe erhalten.
id value
0 1 first
1 1 second
2 1 second
3 2 first
4 2 second
5 3 first
6 3 third
7 3 fourth
8 3 fifth
9 4 second
10 4 fifth
11 5 first
12 6 first
13 6 second
14 6 third
15 7 fourth
16 7 fifth
Erwartetes Ergebnis
id value
1 first
2 first
3 first
4 second
5 first
6 first
7 fourth
Ich habe versucht zu folgen, was nur die erste Zeile der gibt DataFrame
. Jede Hilfe hierzu ist willkommen.
In [25]: for index, row in df.iterrows():
....: df2 = pd.DataFrame(df.groupby(['id','value']).reset_index().ix[0])
first()
Bezug auf nans sehr überraschend ist und etwas, von dem ich denke, dass die meisten Leute es nicht erwarten werden.Antworten:
Wenn Sie
id
als Spalte benötigen :Um n erste Datensätze zu erhalten, können Sie head () verwenden:
quelle
tail(n)
(Standard ist n = 5) ( Ref. ). Nicht zu verwechselnlast()
, ich habe diesen Fehler gemacht.groupby('id',as_index=False)
hält auchid
als KolumneDies gibt Ihnen die zweite Zeile jeder Gruppe (null indiziert, n-te (0) ist die gleiche wie first ()):
Dokumentation: http://pandas.pydata.org/pandas-docs/stable/groupby.html#taking-the-nth-row-of-each-group
quelle
nth((0,1,2))
odernth(range(3))
.TypeError: n needs to be an int or a list/set/tuple of ints
range(3)
wird keine Liste zurückgegeben, es sei denn, Sie geben einlist(range(3))
.Ich würde vorschlagen,
.nth(0)
eher zu verwenden, als.first()
wenn Sie die erste Zeile erhalten müssen.Der Unterschied zwischen ihnen ist , wie sie NaNs handhaben , so
.nth(0)
wird die erste Zeile der Gruppe zurückkehren , egal , was die Werte in dieser Reihe sind, während.first()
schließlich die erste Rückkehr nichtNaN
Wert in jeder Spalte.ZB wenn Ihr Datensatz ist:
Und
quelle
.head(1)
scheint sich auch so zu verhalten.nth(0)
, mit Ausnahme des IndexVielleicht ist es das, was du willst
quelle
Wenn Sie nur die erste Zeile aus jeder Gruppe benötigen, mit der wir arbeiten können
drop_duplicates
, beachten Sie die Standardmethode der Funktionkeep='first'
.quelle