簡體   English   中英

根據另一個數據框中的信息為一個數據框中的行子集分配一個值(在一個列中)

[英]Assign a subset of rows in a dataframe with a value (in one column) based on information in another dataframe

我有兩個數據框:包含所有數據的“數據”,包含相同列的“ peak_data”,對行的選擇很少。

我創建了一個列,該列顯示“ peak_data”中相鄰行之間的“ time_difference”。

我想用一個數字標記“數據”中的行(在“周期”列中),該數字在到達下一個“峰值”時會發生變化(該值由“列”中“數據”數據框中的二進制文件標識)該時間間隔內peak_data中的“ time_difference”小於2。

“數據”數據框的一個小例子:

       time  pressure_1  pressure_2  ...   accel_z  peak  cycle
0  0.000000    0.245956    0.048084  ...  0.155026     0    NaN
1  0.002000    0.245957    0.047805  ...  0.073971     0    NaN
2  0.002333    0.245984    0.047586  ... -0.056461     0    NaN
3  0.002667    0.246048    0.047464  ...  0.013302     0    NaN
4  0.003000    0.246161    0.047462  ...  0.047970     0    NaN

“ peak_data”數據幀的一個小示例:

       time  pressure_1  pressure_2  ...   accel_z  peak  time_difference
269   1.314    0.134094    0.036958  ... -0.160587   1.0              NaN
555   2.754    0.091645    0.032614  ... -0.514713   1.0            1.440
811   4.064    0.096233    0.049880  ... -0.433658   1.0            1.310
1057  5.300    0.094882    0.032966  ... -0.867374   1.0            1.236
1304  6.522    0.107792    0.040102  ... -0.503299   1.0            1.222

我想看到的是確定了第一個峰之后的行(在此之前,我不想標記數據)。 對於下一個間隔,我希望將其標記為“ 2”,然后標記為“ 3”,等等。

       time    pressure_1  pressure_2  ...   accel_z  peak  cycle
265  1.294000    0.141472    0.033975  ... -0.027896     0    NaN
266  1.299000    0.140781    0.034691  ... -0.110416     0    NaN
267  1.304000    0.139336    0.035434  ... -0.103580     0    NaN
268  1.309000    0.137103    0.036195  ...  0.159482     0    NaN
269  1.314000    0.134094    0.036958  ... -0.160587     1    1
270  1.322000    0.130359    0.037705  ... -0.489627     0    1
271  1.329000    0.125974    0.038417  ... -0.832096     0    1
272  1.332000    0.121045    0.039078  ... -0.639713     0    1
273  1.334000    0.115730    0.039676  ... -0.565494     0    1
274  1.339000    0.110218    0.040197  ... -0.475040     0    1

這是處理以下問題的代碼:

data['cycle'] = np.nan

cycle_num = 1

for index, row in peak_data.iterrows():        
    if peak_data.loc[index,'time_difference'] == np.nan:
        pass
    elif peak_data.loc[index,'time_difference'] < 2:
        start = peak_data.loc[index,'index'] 
        end = peak_data.loc[index,'index']
        data.loc[start : end,'cycle'] = cycle_num
        cycle_num += 1

上面的代碼給了我一個KeyError:'index',以前我把它當作'time',但我不確定為什么。

這是我應該解決問題的方式,還是有更好的方法? 任何指針將不勝感激!

它看起來像的整數索引標簽peak_data數據幀正好對應於目標行的索引標簽data 如果對於您的完整數據集總是如此,那么應該可以這樣做:

# Initialize column of all nan
data['cycle'] = np.nan

# Get index labels for short (< 2 s) and
# long (>= 2 s) peaks
short_peaks = peak_data[peak_data['time_difference'] < 2].index
long_peaks = peak_data[peak_data['time_difference'] >= 2].index

# Label short-peak rows with 1, long with -1
data.loc[short_peaks, 'peak'] = 1
data.loc[long_peaks, 'peak'] = -1

# 
data['cycle'] = data['peak'].cumsum()

# Hack: build a flag column that labels ALL rows
# belonging to a short peak with 1, and ALL rows
# belonging to a short peak with -1
data['flag'] = data['peak'].ffill()

# Finally, overwrite the "cycle" value with -1 for all rows
# belonging to a long peak, then replace -1 with nan
data.loc[data['flag'] == -1, 'cycle'] = data['flag'].replace(-1, np.nan)

# Drop the flag column
data = data.drop(columns='flag')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM