[英]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()
将前一行的min
和max
更改为NaN
,而不是NaN
。 然后删除min
和max
均为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”,然后将其设为键。
注意:我已将数据添加到列表中,因为当长度不同时,我不确定您打算如何将其作为列包含在内。
如果我的假设是正确的,那么这应该有效。
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.