Python 根据条件组合两列dataframe

Python 根据条件组合两列dataframe,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我已经创建了一个数据帧 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 N

我已经创建了一个数据帧

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
< P>我想创建一个新的列,它将从最小值取一个值,然后从最大值取一个值。如果存在最小值/最大值的2个值(如我们可以看到12和13是2个值),我必须只考虑一个值(只考虑12个,然后移动到选择min)< /P> 总之,, 新列应该有一个最小值行,然后是一个最大值行,依此类推

输出应该是

combined
10
4
12
5
8

您可以尝试使用将前一行未
NaN
min
max
的值更改为
NaN
。然后删除
min
max
均为
NaN
的行。然后用每行中的
max
值更新
min
中的
NaN
值,方法是:

结果:

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

您可以为要包含的第一个值定义第一个键,例如“max”,然后遍历数据帧,并在更改键的同时将值附加到数据结构中。同时,您必须检查“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索引,然后使用布尔索引过滤器/仅选择
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)


如果我的假设是正确的,那么这应该是可行的

  • 该值是'Nan'字符串,而不是np.Nan
  • 如果最小列有“Nan”值,则最大列将有数字,反之亦然,这意味着任何行都不能有两个数字
  • 这是我得到的输出

       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
    

    同一行上是否可以有两个非nan值?不可能。请告诉我您是否想知道如何检查应首先使用哪个键的逻辑。这不是您所显示的打印输出。请在运行代码后检查这是输出。0南10Nan@sam你是说只有一排?真奇怪,是的。你能给我发一个完整的代码在我这边试试吗?@Sam让我知道我能帮上什么忙!:-)它没有按要求打印输出。我认为
    Nan
    值是数据帧中的字符串,让我们先用实际的
    Nan
    屏蔽
    Nan
    值,然后尝试解决方案。@sam我编辑了答案。我也检查了实际的Nan,但它没有按预期打印输出现在它打印所有行,你能发布你尝试过的完整代码吗woring@SAKL所需输出不同,请检查问题中张贴的输出
       combined
    0      10.0
    1       4.0
    2      12.0
    4       5.0
    7       8.0
    
    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'])
    
       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