Операции в фрейме данных

#python #pandas #dataframe #pandas-groupby

#python #панды #фрейм данных #pandas-groupby

Вопрос:

У меня есть данные cvs, этот набор данных имеет разные местоположения на широте от 17 до 20, и в каждом местоположении есть ежемесячные данные, т.е. (1,2,3,4,5,6, …). Я хотел бы добавить новое имя столбца и N, и это зависит от широты и значения в месяц, укажите соответствующий связанный номер длязаданное значение. Входные данные

 lan/lon/year/month/prec
-17/18/1990/1/0.4
-17/18/1990/2/0.02
-17/18/1990/3/0.12
-17/18/1990/4/0.06
.
.
.
-17/18/2020/12/0.35
-17/20/1990/1/0.2
-17/20/1990/2/0.2
-17/20/1990/3/0.2
-17/20/1990/4/0.2
.
.
.
-17/20/2020/12/0.08
-18/20/1990/1/0.11
-18/20/1990/2/0.11
-18/20/1990/3/0.11
.
.
.
.
  

N значений зависят от широты и месяца

     17  18  19  20  21
1   25  29  13  13  2
2   22  11  1   16  23
3   8   13  10  21  8
4   4   14  16  10  13
5   23  30  8   8   18
6   16  4   7   5   29
7   26  5   10  25  28
8   3   16  2   27  2
9   21  16  23  8   7
10  19  30  10  28  20
11  28  18  12  6   8
12  21  14  26  3   8
  

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ

 lan/lon/year/month/prec/N
-17/18/1990/1/0.4/25
-17/18/1990/2/0.02/22
-17/18/1990/3/0.12/8
-17/18/1990/4/0.06/4
.
.
.
-17/18/2020/12/0.35/21
-17/20/1990/1/0.2/25
-17/20/1990/2/0.2/22
-17/20/1990/3/0.2/8
-17/20/1990/4/0.2/4
.
.
.
-17/20/2020/12/0.08/21
-18/20/1990/1/0.11/29
-18/20/1990/2/0.11/11
-18/20/1990/3/0.11/13
.
.
.
.
  

Комментарии:

1. lan значения отрицательны? Или это образец данных, должен быть положительным?

2. Значения широты могут быть положительными и отрицательными, для этого примера lat 17 я принял за отрицательное, но, думаю, это та же идея

3. да, вы можете протестировать мое решение? Как работать с вашими реальными данными?

Ответ №1:

Используйте DataFrame.stack для изменения второго df2 с переименованием имен мультииндексов для сопоставления по столбцам lat1, month в df by DataFrame.join :

 df = pd.read_csv(data, sep="/")

s = df2.rename(columns=int).unstack().rename_axis(['lan1','month'])

df['lan1'] = df['lan'].abs()


df2 = df.join(s.rename('N'), on=['lan1','month']).drop('lan1', axis=1)
print (df2)
    lan  lon  year  month  prec   N
0   -17   18  1990      1  0.40  25
1   -17   18  1990      2  0.02  22
2   -17   18  1990      3  0.12   8
3   -17   18  1990      4  0.06   4
4   -17   18  2020     12  0.35  21
5   -17   20  1990      1  0.20  25
6   -17   20  1990      2  0.20  22
7   -17   20  1990      3  0.20   8
8   -17   20  1990      4  0.20   4
9   -17   20  2020     12  0.08  21
10  -18   20  1990      1  0.11  29
11  -18   20  1990      2  0.11  11
12  -18   20  1990      3  0.11  13
  

 print (df2.to_csv(sep='/', index=False))
lan/lon/year/month/prec/N
-17/18/1990/1/0.4/25
-17/18/1990/2/0.02/22
-17/18/1990/3/0.12/8
-17/18/1990/4/0.06/4
-17/18/2020/12/0.35/21
-17/20/1990/1/0.2/25
-17/20/1990/2/0.2/22
-17/20/1990/3/0.2/8
-17/20/1990/4/0.2/4
-17/20/2020/12/0.08/21
-18/20/1990/1/0.11/29
-18/20/1990/2/0.11/11
-18/20/1990/3/0.11/13
  

 print (s)

lan  month
17   1        25
     2        22
     3         8
     4         4
     5        23
     6        16
     7        26
     8         3
     9        21
     10       19
     11       28
     12       21
18   1        29
     2        11
     3        13
     4        14
     5        30
     6         4
     7         5
     8        16
     9        16
     10       30
     11       18
     12       14
19   1        13
     2         1
     3        10
     4        16
     5         8
     6         7
     7        10
     8         2
     9        23
     10       10
     11       12
     12       26
20   1        13
     2        16
     3        21
     4        10
     5         8
     6         5
     7        25
     8        27
     9         8
     10       28
     11        6
     12        3
21   1         2
     2        23
     3         8
     4        13
     5        18
     6        29
     7        28
     8         2
     9         7
     10       20
     11        8
     12        8
dtype: int64
    
  

Комментарии:

1. И если у меня есть диапазон широт, например, 17,5 17,3, как я могу выполнить интерполяцию, вручную это невозможно для размера набора данных

2. @KaSan — К сожалению, не понимаю, в примерах данных нет плавающих значений. Если данные являются плавающими и нуждаются в интерполяции, это должен быть новый вопрос.