pandas 使用条件填充2D数组

a14dhokn  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(82)

Year, TC_Number, Maximum wind speeds

data = pd.DataFrame({
'year': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2],
'TC_number': [0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
'maximum_wind_speed': [20.37199783, 21.2, 21.7, 14.626, 18.108, 21.4, 25.3, 25.3, 22.9, 18.108, 20.2, 22.1, 24.3, 25.5, 27.7, 29.8, 33.6, 36.7, 36.6, 35, 33, 29.7, 29, 20]})

字符串
大家好,
我试着通过网上搜索找到解决方案,但是,似乎没有一个是我要找的。
我知道我想做什么,但我被如何实现代码卡住了。
我首先初始化一个(1000,240)数组。然后我想创建一个循环来填充数组的每一行。每行代表一个热带气旋(TC)记录的最大风速值,240代表TC可能具有的最大值数量。然而,每个TC将具有在最大风速行中记录的不同数量的值。当当前TC编号不等于前一个TC编号时,我希望循环跳转到下一行。
这是我到目前为止所拥有的:

output_array = np.full((1000, 240), np.nan)

#Shape of vmaxsyn is (337079,)

for i in range(1000):
    #print("i = ", i)
    for j in range(241):
        #print("j = ", j)
        name_id1 = df.iloc[j]['TC_number']
        name_id2 = df.iloc[j-1]['TC_number']
        
        if name_id1 == name_id2:
            output_array[i, j] = vmaxsyn[j]
            #print(output_array[j,i])
            #print([i,j])
        else: 
            #print("breaking out of inner loop")
            break 
#print("breaking out of outer loop.")


我期待着这样的事情:

data = [
[20.372, 21.2, 21.7, 14.62, np.nan, np.nan],
[18.108, 21.4, 25.3, 25.3, 22.9, np.nan],
[18.108, 20.2, 22.1, 24.3, np.nan, np.nan],
[25.5, 27.1, 29.8, 33.6, np.nan, np.nan],
[36.7, 36.6, 35, np.nan, np.nan, np.nan],
[33, 29.7, 29, np.nan, np.nan, np.nan]]


问题是没有一个vmaxsyn值被记录到我的输出数组中。我还试图用我的另一种方法来处理广播错误。任何帮助都非常感谢。我特别想用Pandas来实现这一点。

dtcbnfnu

dtcbnfnu1#

这里根本不需要for循环。首先,将一个id列附加到您的数据中,该列在TC_number更改时递增。然后按这个新创建的id对数据进行分组,并使用pandas.DataFrame.apply将其转换为列表。

data['tc_id'] = data['TC_number'].ne(data['TC_number'].shift()).cumsum()-1

array = data.groupby('tc_id')['maximum_wind_speed'].apply(list)

字符串
结果会是这样

print(array)

tc_id
0    [20.37199783, 21.2, 21.7, 14.626]
1     [18.108, 21.4, 25.3, 25.3, 22.9]
2           [18.108, 20.2, 22.1, 24.3]
3             [25.5, 27.7, 29.8, 33.6]
4                   [36.7, 36.6, 35.0]
5             [33.0, 29.7, 29.0, 20.0]

whhtz7ly

whhtz7ly2#

我不太明白你的输入/输出数组是怎么回事,但你可以这样做:

array = np.full((1000, 240), np.nan)    

last = None
i = 0
for tc_number, wind_speed in zip(tc_numbers_input, wind_speeds_input): # replace by your values
    if last != tc:
        i = 0
    last = tc
    array[tc][i] = speed
    i += 1

字符串
使用一个大小为(10,10)的数组,输入为(print([list(x) for x in array])

[
    [20.37199783, 21.2, 21.7, 14.626, nan, nan, nan, nan, nan, nan],
    [18.108, 21.4, 25.3, 25.3, 22.9, nan, nan, nan, nan, nan],
    [18.108, 20.2, 22.1, 24.3, nan, nan, nan, nan, nan, nan],
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],
    [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],
    ...
]

相关问题