簡體   English   中英

根據條件組合 2 列 dataframe

[英]combine 2 columns of dataframe based on a condition

我創建了一個數據框

data = [['Nan', 10], [4, 'Nan'], ['Nan', 12], ['Nan', 13], [5, 'Nan'], [6, 'Nan'], [7, 'Nan'], ['Nan', 8]]
df = pd.DataFrame(data, columns = ['min', 'max'])
print(df)

我的數據集看起來像,

min    max
Nan    10
4      Max
Nan    12
Nan    13
5      Nan 
6      Nan
7      Nan
Nan    8

我想創建一個新列,它將從 min 中獲取一個值,然后從 max 中獲取一個值。 如果有續。 2個最小值/最大值(我們可以看到12和13是2個值)我只需要考慮一個值(只考慮12然后移動到select min)

簡而言之,新列應該有一個最小值行,然后是一個最大值行,依此類推。

OUTPUT 應該是

combined
10
4
12
5
8

您可以嘗試使用.where()將前一行的minmax更改為NaN ,而不是NaN 然后刪除minmax均為NaN的行。 然后使用.combine_first()min中的NaN值更新為每行中的max值:

df = df.replace('Nan', np.nan)

df['min'] = df['min'].where(df['min'].shift().isna())
df['max'] = df['max'].where(df['max'].shift().isna())
df = df.dropna(how='all')
df['combined'] = df['min'].combine_first(df['max'])

結果:

print(df)


   min   max  combined
0  NaN  10.0      10.0
1  4.0   NaN       4.0
2  NaN  12.0      12.0
4  5.0   NaN       5.0
7  NaN   8.0       8.0

堆疊 dataframe 以重塑為多索引系列,然后重置 1 級索引,然后使用 boolean 索引過濾器/僅選擇min后跟max的行,反之亦然

s = df[df != 'Nan'].stack().reset_index(name='combined', level=1)
m = s['level_1'] != s['level_1'].shift()
s[m].drop('level_1', 1)

   combined
0      10.0
1       4.0
2      12.0
4       5.0
7       8.0

您可以做的是為要包含的第一個值定義第一個鍵,例如“max”,然后在更改鍵的同時遍歷 DataFrame 和 append 值到您的數據結構。 同時,您必須檢查“NaN”值,因為您有很多這樣的值,

combined = []
key = 'max'
for index, row in df.iterrows():
  if not row[key] != row[key]:
    combined.append(row[key])
    if key == 'max':
      key = 'min'
    else:
      key = 'max'

在這里,我剛剛硬編碼了第一個值,但如果您不想這樣做,您可以檢查第一行中的哪一列的實際值不是“NaN”,然后將其設為鍵。

注意:我已將數據添加到列表中,因為當長度不同時,我不確定您打算如何將其作為列包含在內。

如果我的假設是正確的,那么這應該有效。

  1. 該值是 'Nan' 字符串,而不是 np.NaN
  2. 如果 min 列具有“Nan”值,則 max 列將具有數字,反之亦然,這意味着任何行都不能有兩個數字。
import numpy as np
import pandas as pd


data = [['Nan', 10], [4, 'Nan'], ['Nan', 12], ['Nan', 13], [5, 'Nan'], [6, 'Nan'], [7, 'Nan'], ['Nan', 8]]
df = pd.DataFrame(data, columns = ['min', 'max'])


df['combined'] = np.where(df['min']!='Nan', df['min'], df['max'])

這是我得到的 output

   min  max combined
0  Nan   10       10
1    4  Nan        4
2  Nan   12       12
3  Nan   13       13
4    5  Nan        5
5    6  Nan        6
6    7  Nan        7
7  Nan    8        8

暫無
暫無

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

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