Split der Rahmen in der Hälfte nach dem Einschalten Year
und LG
Gruppierung. Grundidee ist die Lage in der Gruppe zu finden, die weniger als 50% der Gruppengröße ist
Code:
# group by 'Year' and 'LG'
idx = ['Year', 'LG']
# build a grouper
group_by = df.groupby(idx, as_index=False)
# need frame to re-expand the group size
df1 = df.set_index(idx)
df1['g_size'] = group_by.size()
# find the rows in the top half of respective group
top_half = (group_by.cumcount()/df1.g_size.values).values < 0.5
# build new data frames
top = df.loc[top_half]
bot = df.loc[~top_half]
-Code für die Sortierung auf Datum:
Wenn der Rahmen muss werden nach dem Datum vor der Spaltung sortiert, aber nicht die Art wollen in der ursprünglichen Datenrahmen zu sein ...
# group by 'Year' and 'LG'
idx = ['Year', 'LG']
# sort by date
df1 = df.sort('Date')
# build a grouper
group_by = df1.groupby(idx, as_index=False)
# Need to set the index to match the result of groupby.size()
df1 = df1.set_index(idx)
df1['g_size'] = group_by.size()
# find the rows in the top half of respective group
top_half = (group_by.cumcount()/df1.g_size.values).values < 0.5
# build new data frames
top = df1.loc[top_half].drop('g_size', axis=1).reset_index()
bot = df1.loc[~top_half].drop('g_size', axis=1).reset_index()
Testcode:
print(df)
print('-- top')
print(top)
print('-- bot')
print(bot)
print('--')
Sortiert Ergebnisse:
Date LG Year
0 2011-1-1 AR1 2011
1 2011-3-1 AR1 2011
2 2011-4-1 AR1 2011
3 2011-2-1 AR1 2011
4 2012-1-1 AR1 2012
5 2012-2-1 AR1 2012
6 2012-1-1 PO1 2012
7 2012-2-1 PO1 2012
8 2013-1-1 AR1 2013
9 2013-2-1 AR1 2013
10 2013-1-1 PO1 2013
11 2013-2-1 PO1 2013
-- top
Year LG Date
0 2011 AR1 2011-1-1
1 2011 AR1 2011-2-1
2 2012 AR1 2012-1-1
3 2012 PO1 2012-1-1
4 2013 AR1 2013-1-1
5 2013 PO1 2013-1-1
-- bot
Year LG Date
0 2011 AR1 2011-3-1
1 2011 AR1 2011-4-1
2 2012 AR1 2012-2-1
3 2012 PO1 2012-2-1
4 2013 AR1 2013-2-1
5 2013 PO1 2013-2-1
Testdaten.
df = pd.DataFrame({
'LG': ('AR1', 'AR1', 'AR1', 'AR1', 'AR1', 'AR1',
'PO1', 'PO1', 'AR1', 'AR1', 'PO1', 'PO1'),
'Date': ('2011-1-1', '2011-3-1', '2011-4-1', '2011-2-1', '2012-1-1',
'2012-2-1', '2012-1-1', '2012-2-1', '2013-1-1', '2013-2-1',
'2013-1-1', '2013-2-1'),
'Year': (2011, 2011, 2011, 2011, 2012, 2012, 2012, 2012, 2013,
2013, 2013, 2013)
})
pd.to_datetime(df['Date'])
'df [ 'Date'] gelten (pd.to_datetime) 'ist eine langsame Art,' pd.to_datetime (df ['Date']) 'zu sagen. –
bearbeitet per Sie Bemerkung – Zanshin