Как создать новый столбец из подмножества других существующих столбцов? - PullRequest
2 голосов
/ 05 октября 2019

У меня есть набор данных, который содержит месячный ВВП за 2000-2016 годы, индексированный по штатам и городам. Столбцы, представляющие ВВП, отформатированы как «год-месяц», поэтому, например, «2000-01» представляет январь 2000 года. Я пытаюсь получить ВВП по финансовому кварталу, где каждый квартал является средним значением ВВП соответствующего месяца.

Ниже приведен фрагмент фрейма данных (игнорируйте значения только для примера).

State    City        2000-01   2000-02   2000-03   2000-04   2000-05   2000-06 
Alabama  Adamsville  1000      1005      1020      1119      1125      1000
Alabama  Alabaster   1093      1312      1542      1624      1134      1953
Alabama  Axis        18324     98174     14047     27343     43234     12434

Мой ожидаемый результат следующий (опять же, значения составлены). Например, 2000q1 является средним значением столбцов 2000-01, 2000-02 и 2000-03.

State    City        2000q1   2000q2 
Alabama  Adamsville  1010     1006
Alabama  Alabaster   1100     1750
Alabama  Axis        15673    19849

Я пробовал несколько разных способов, в частности:

Поскольку выходной фрейм данных будет иметь 64 разных квартала, для каждого квартала неэффективно делать следующее:

df['2000q1']=df[['2000-01', '2000-02', '2000-03']].mean(axis=1)

В другой попытке я изменил все имена столбцов, чтобы они представляли квартал, в котором они должны находиться, в результате три одинаковых имени столбца (но не базовые данные) для каждого квартала, как показано ниже. Поскольку имена столбцов были идентичны, я затем пытался найти среднее значение для каждого трио одинаковых имен столбцов.

State    City        2000q1    2000q1    2000q1    2000q2    2000q2    2000q2 
Alabama  Adamsville  1000      1005      1020      1119      1125      1000
Alabama  Alabaster   1093      1312      1542      1624      1134      1953
Alabama  Axis        18324     98174     14047     27343     43234     12434

Ответы [ 2 ]

1 голос
/ 05 октября 2019

Я думаю, что когда-то работал над подобной проблемой на Coursera.com. Вы можете попробовать это (предполагая, что имя вашего фрейма данных 'df'):

df = (df.groupby(pd.PeriodIndex(df.columns, freq='Q'), axis=1).mean())

Вы получите имена столбцов, такие как '2000Q1'. Если вы хотите получить имена как «2000q1», вы можете попробовать это:

df = (df.groupby(pd.PeriodIndex(df.columns, freq='Q'), axis=1).mean().rename(columns=lambda c: str(c).lower()))
0 голосов
/ 05 октября 2019

примите ваш фрейм данных как df

data = df.iloc[:,2:]
predf = df.iloc[:,:2]
colnums = [i for i in range(0,len(data.columns),3)]
newdf = pd.DataFrame()
for idx,val in enumerate(colnums):
    name = data.columns[idx].split("-")[0]
    colname = f"{name}-q{idx+1}"
    newdf[colname] = data.iloc[:,val:(val+2)].mean(axis=1)

output = pd.concat([predf,newdf],axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...