Mam zestaw danych, który można zgrupować: DF.Groupby (DF.Batch.str [: 7]) Różne rozmiary grup są DF.Groupby (DF.Batch.str [: 7]). Rozmiar (). Unikalny (). Array ([1, 2, 3, 4, 5, 6, 7]) Powiemy, że ...

1
alex3465 15 marzec 2021, 17:14

2 odpowiedzi

Najlepsza odpowiedź

Użyj DataFrameGroupBy.shift:

df['col2'] = df.groupby(df.batch.str[:7])['col2'].shift(-1)

Edytuj: Jeśli potrzeba sortowania na wiele kolumn jest możliwe Utwórz kolumnę a przez pierwsze 7 wartości partii i przejść do {x1}}:

df = df.assign(a = df.batch.str[:7]).sort_values(['a', 'time'], 
                                                 ascending=[True, False])

df['col2'] = df.groupby('a')['col2'].shift(-1)
1
jezrael 15 marzec 2021, 15:05

Możemy spróbować użyć sorted za pomocą key w tej sytuacji nie potrzebujesz martwego, ile NaN na górze

df['new'] = df.groupby(df.col1.str[:7])['col2'].apply(lambda x : sorted(x, key=pd.isnull) ).explode().values
df
Out[145]: 
      col1  col2  time  new
0  rt_2345   NaN  1:00    3
1  rt_2345   3.0  2:00    4
2  rt_2345   4.0  3:00   46
3  rt_2345  46.0  4:00  NaN
1
BENY 15 marzec 2021, 14:21