【问题标题】:Substituting values with conditions用条件替换值
【发布时间】:2022-07-06 02:59:46
【问题描述】:

我有一个像下面这样的数据框

   Air Station Code  Humidity  Temperature  Latitude  Longitude

        St.1           20         10        10.00      10.00
        St.2            4         15        25.00      30.00
        St.3           16         21         8.00      15.00
        St.4           38          8        31.00      40.00
        St.5           10         18        10.00      10.00
        St.6           40          4        25.00      30.00
        St.7           10         13         8.00      15.00
        St.8           46         11        31.00      40.00
        St.9           28          9        10.00      10.00
        St.10          14         22        25.00      30.00
        St.11           5         40         8.00      15.00
        St.12          11         10        31.00      40.00
                                    ...

        St.89          61         35        10.00      10.00 
        St.90          23         29        25.00      30.00
        St.91          35         12         8.00      15.00
        St.92          31          7        31.00      40.00

我想通过匹配坐标来改变车站代码,通过重复前4个代码替换代码,得到这个

   Air Station Code  Humidity  Temperature  Latitude  Longitude

        St.1           20         10        10.00      10.00
        St.2            4         15        25.00      30.00
        St.3           16         21         8.00      15.00
        St.4           38          8        31.00      40.00
        St.1           10         18        10.00      10.00
        St.2           40          4        25.00      30.00
        St.3           10         13         8.00      15.00
        St.4           46         11        31.00      40.00
        St.1           28          9        10.00      10.00
        St.2           14         22        25.00      30.00
        St.3            5         40         8.00      15.00
        St.4           11         10        31.00      40.00
                                    ...

        St.1           61         35        10.00      10.00 
        St.2           23         29        25.00      30.00
        St.3           35         12         8.00      15.00
        St.4           31          7        31.00      40.00

是否有某种方法可以在整个数据帧上实现“if/else”替换,而无需手动检查 python 中的每个观察结果?

【问题讨论】:

  • 下面的答案是提供代码......但老实说......你很可能不应该走这条路......只需通过组合一些字符串以及长和纬度数据来为每个站创建唯一的 ID

标签: python pandas dataframe substitution


【解决方案1】:

可能有更好的方法来做到这一点,但这可以解决问题。我创建了第二个没有重复的数据框,它保留了每个纬度/经度的第一次出现。我将 lat/long 设为索引并删除其他列。然后我做一个“加入”,添加一个具有匹配纬度/经度的新列。然后我用查找到的站号覆盖原来的站号。

import pandas as pd

data = [
    ["St.1", 20, 10, 10.00, 10.00],
    ["St.2", 4, 15, 25.00, 30.00],
    ["St.3", 16, 21, 8.00, 15.00],
    ["St.4", 38, 8, 31.00, 40.00],
    ["St.5", 10, 18, 10.00, 10.00],
    ["St.6", 40, 4, 25.00, 30.00],
    ["St.7", 10, 13, 8.00, 15.00],
    ["St.8", 46, 11, 31.00, 40.00],
    ["St.9", 28, 9, 10.00, 10.00],
    ["St.10", 14, 22, 25.00, 30.00],
    ["St.11", 5, 40, 8.00, 15.00],
    ["St.12", 11, 10, 31.00, 40.00],
    ["St.89", 61, 35, 10.00, 10.00],
    ["St.90", 23, 29, 25.00, 30.00],
    ["St.91", 35, 12, 8.00, 15.00],
    ["St.92", 31, 7, 31.00, 40.00],
]

column = "Air_Station_Code  Humidity  Temperature  Latitude  Longitude".split()
df = pd.DataFrame(data,columns=column)
print(df)
df1 = df.drop_duplicates(['Latitude','Longitude'])
df1 = df1[['Air_Station_Code','Latitude','Longitude']]
df1.set_index(['Latitude','Longitude'], inplace=True)
print(df1)
df2 = df.join( df1, on=['Latitude','Longitude'], rsuffix='R' )
print(df2)

df['Air_Station_Code'] = df2['Air_Station_CodeR']
print(df)

输出:

   Air_Station_Code  Humidity  Temperature  Latitude  Longitude
0              St.1        20           10      10.0       10.0
1              St.2         4           15      25.0       30.0
2              St.3        16           21       8.0       15.0
3              St.4        38            8      31.0       40.0
4              St.5        10           18      10.0       10.0
5              St.6        40            4      25.0       30.0
6              St.7        10           13       8.0       15.0
7              St.8        46           11      31.0       40.0
8              St.9        28            9      10.0       10.0
9             St.10        14           22      25.0       30.0
10            St.11         5           40       8.0       15.0
11            St.12        11           10      31.0       40.0
12            St.89        61           35      10.0       10.0
13            St.90        23           29      25.0       30.0
14            St.91        35           12       8.0       15.0
15            St.92        31            7      31.0       40.0
                   Air_Station_Code
Latitude Longitude                 
10.0     10.0                  St.1
25.0     30.0                  St.2
8.0      15.0                  St.3
31.0     40.0                  St.4
   Air_Station_Code  Humidity  ...  Longitude  Air_Station_CodeR
0              St.1        20  ...       10.0               St.1
1              St.2         4  ...       30.0               St.2
2              St.3        16  ...       15.0               St.3
3              St.4        38  ...       40.0               St.4
4              St.5        10  ...       10.0               St.1
5              St.6        40  ...       30.0               St.2
6              St.7        10  ...       15.0               St.3
7              St.8        46  ...       40.0               St.4
8              St.9        28  ...       10.0               St.1
9             St.10        14  ...       30.0               St.2
10            St.11         5  ...       15.0               St.3
11            St.12        11  ...       40.0               St.4
12            St.89        61  ...       10.0               St.1
13            St.90        23  ...       30.0               St.2
14            St.91        35  ...       15.0               St.3
15            St.92        31  ...       40.0               St.4

[16 rows x 6 columns]
   Air_Station_Code  Humidity  Temperature  Latitude  Longitude
0              St.1        20           10      10.0       10.0
1              St.2         4           15      25.0       30.0
2              St.3        16           21       8.0       15.0
3              St.4        38            8      31.0       40.0
4              St.1        10           18      10.0       10.0
5              St.2        40            4      25.0       30.0
6              St.3        10           13       8.0       15.0
7              St.4        46           11      31.0       40.0
8              St.1        28            9      10.0       10.0
9              St.2        14           22      25.0       30.0
10             St.3         5           40       8.0       15.0
11             St.4        11           10      31.0       40.0
12             St.1        61           35      10.0       10.0
13             St.2        23           29      25.0       30.0
14             St.3        35           12       8.0       15.0
15             St.4        31            7      31.0       40.0

【讨论】:

    【解决方案2】:
    df['Air Station Code'] = 'St.' + pd.Series(df[['Latitude','Longitude']].astype(str).agg(sum, axis=1).factorize()[0] + 1).astype(str)
    
    df
    Out[77]: 
       Air Station Code  Humidity  Temperature  Latitude  Longitude
    0              St.1        20           10      10.0       10.0
    1              St.2         4           15      25.0       30.0
    2              St.3        16           21       8.0       15.0
    3              St.4        38            8      31.0       40.0
    4              St.1        10           18      10.0       10.0
    5              St.2        40            4      25.0       30.0
    6              St.3        10           13       8.0       15.0
    7              St.4        46           11      31.0       40.0
    8              St.1        28            9      10.0       10.0
    9              St.2        14           22      25.0       30.0
    10             St.3         5           40       8.0       15.0
    11             St.4        11           10      31.0       40.0
    

    【讨论】:

    • 很好的答案,但我认为应该注意,如果“Air Station code”是索引,则应先使用 df.reset_index()。
    • 虽然这对他的示例数据有效,但应该指出的是,这在纬度/经度上不匹配,并且这不是使用原始 df 中的站代码。换句话说,这就是“作弊”……
    • @TimRoberts 没有意识到我们在纬度/经度上匹配。检查编辑
    猜你喜欢
    • 2015-09-19
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 2022-01-19
    • 2018-06-30
    • 2014-08-23
    • 2016-11-17
    相关资源
    最近更新 更多