Man kann mit `duplicated()` auf dem `Series`-Objekt ein `Series`-Objekt bekommen das `False` bei jedem zum ersten mal gesehenen Wert liefert und `True` sonst. Du willst eigentlich das Gegenteil — die Werte die das erste mal gesehen wurden, also mit ``~`` negieren und als Index in das `Series`-Objekt verwenden. Und auf dem Ergebnis kannst Du dann Dein `apply()` aufrufen.
Beispiel mit einem Satz von 100 Zufallswerten zwischen 1 und 10:
Code: Alles auswählen
In [30]: df
Out[30]:
x
0 6
1 1
2 6
3 9
4 3
5 9
6 4
7 7
8 4
9 3
10 4
11 3
12 8
13 2
14 2
15 3
16 10
17 7
18 6
19 5
20 9
21 10
22 4
23 6
24 2
25 5
26 4
27 8
28 3
29 6
.. ..
70 10
71 6
72 6
73 4
74 5
75 3
76 10
77 8
78 1
79 2
80 1
81 7
82 1
83 1
84 9
85 1
86 10
87 9
88 2
89 8
90 1
91 10
92 7
93 2
94 4
95 4
96 2
97 6
98 1
99 5
[100 rows x 1 columns]
In [31]: df.x.duplicated()
Out[31]:
0 False
1 False
2 True
3 False
4 False
5 True
6 False
7 False
8 True
9 True
10 True
11 True
12 False
13 False
14 True
15 True
16 False
17 True
18 True
19 False
20 True
21 True
22 True
23 True
24 True
25 True
26 True
27 True
28 True
29 True
...
70 True
71 True
72 True
73 True
74 True
75 True
76 True
77 True
78 True
79 True
80 True
81 True
82 True
83 True
84 True
85 True
86 True
87 True
88 True
89 True
90 True
91 True
92 True
93 True
94 True
95 True
96 True
97 True
98 True
99 True
Name: x, Length: 100, dtype: bool
In [32]: ~df.x.duplicated()
Out[32]:
0 True
1 True
2 False
3 True
4 True
5 False
6 True
7 True
8 False
9 False
10 False
11 False
12 True
13 True
14 False
15 False
16 True
17 False
18 False
19 True
20 False
21 False
22 False
23 False
24 False
25 False
26 False
27 False
28 False
29 False
...
70 False
71 False
72 False
73 False
74 False
75 False
76 False
77 False
78 False
79 False
80 False
81 False
82 False
83 False
84 False
85 False
86 False
87 False
88 False
89 False
90 False
91 False
92 False
93 False
94 False
95 False
96 False
97 False
98 False
99 False
Name: x, Length: 100, dtype: bool
In [33]: df.x[~df.x.duplicated()]
Out[33]:
0 6
1 1
3 9
4 3
6 4
7 7
12 8
13 2
16 10
19 5
Name: x, dtype: int64
In [34]: df.x[~df.x.duplicated()].apply(lambda x: -x)
Out[34]:
0 -6
1 -1
3 -9
4 -3
6 -4
7 -7
12 -8
13 -2
16 -10
19 -5
Name: x, dtype: int64
Bei Deinem Code ist übrigens das ``lambda`` überflüssig wenn das nur dazu dient das Argument 1:1 an die tatsächliche Funktion durchzureichen.
Die zweite Frage verstehe ich nicht, denn Du bekommst doch ein `Series`-Objekt und das hat einen Index, und der Index sind genau die Werte die Du gerne hättest:
Code: Alles auswählen
In [35]: df.x.value_counts()
Out[35]:
8 14
1 12
4 11
10 10
7 10
3 10
2 10
9 9
6 8
5 6
Name: x, dtype: int64