Unterschied zwischen zwei Werten derselben Spalte im selben Pandas-Datenrahmen basierend auf den Bedingungen - Python, Pandas, Dataframe, min

Ich habe einen Pandas Datenrahmen df1 des Formats:

df1.head()

action id     ts
0   A   3   2016-01-28 06:14:08.249000
1   B   3   2016-01-28 07:08:49.901000
2   A   4   2016-01-28 10:42:27.228000
3   B   4   2016-01-29 04:15:33.724000
4   B   4   2016-01-29 04:20:33.724000
5   A   5   2016-01-28 11:12:51.892000

Datentypen von Spalten: (action: string, id: int, ts: Serie (used pandas.to_datetime () um es von string zu konvertieren))

Was ich will, ist eine neue Spalte in der gleichenDatenrahmen / eine andere Reihe, die einen Zeitunterschied zwischen der Aktion "A" und der Aktion "B" derselben IDs aufweist. Das einzige Ding ist, ich brauche das erste Vorkommen von Aktion "A" wie in min(ts) für jede ID und dann den subtrahierten Wert, weil die Aktion "B" nach der Aktion "B" auftreten muss, muss ich die Latenz zwischen dem ersten Auftreten der Aktion "A" und der Aktion "B" bestimmen

Ich konnte es benutzen groupby(), merge() und unstack() aber ich konnte das nicht bekommen min(ts) in diesem.

Danke im Voraus.

Antworten:

1 für die Antwort № 1

Ein Weg, um das zu erreichen, wäre etwa so:

In [87]: df
Out[87]:
action  id                      ts
0      B   3 2016-01-28 06:14:08.249
1      A   3 2016-01-28 07:08:49.901
2      A   4 2016-01-28 10:42:27.228
3      B   4 2016-01-29 04:15:33.724
4      B   4 2016-01-29 04:20:33.724
5      B   5 2016-01-28 11:12:51.892

In [88]: grp = df.groupby(["id"])

In [89]: grp.apply(lambda x: x[x["action"] == "B"].ts.max()) - 
....: grp.apply(lambda x: x[x["action"] == "A"].ts.min())
Out[89]:
id
3   -1 days +23:05:18.348000
4            17:38:06.496000
5                        NaT
dtype: timedelta64[ns]

HINWEIS: Bitte beachten Sie bei Ihrem Beispieldatensatz - Aktion B für ID 3 aufgetreten vor Aktion A

Wenn Sie NaT "s beseitigen wollen, können Sie verwenden .dropna():

In [82]: result = (grp.apply(lambda x: x[x["action"] == "B"].ts.max()) - 
....:           grp.apply(lambda x: x[x["action"] == "A"].ts.min())).dropna()

In [83]: result
Out[83]:
id
3   -1 days +23:05:18.348000
4            17:38:06.496000
dtype: timedelta64[ns]

Speisekarte