我有一个数据框架main_df。我已经生成了给定步长为1的半开或半闭区间。数据和代码如下:
mainList= [[0.3, 0.2, 0.2, 0.5, 0.2, 0.3, 0. , 0.2, 0.4, 0.2],
[0.2, 0.1, 0.2, 0.5, 0.2, 0.2, 0. , 0.2, 0.4, 0.1],
[0.2, 0.1, 0.2, 0.6, 0.2, 0.2, 0. , 0.2, 0.3, 0. ],
[0.2, 0.1, 0.3, 0.6, 0.2, 0.2, 0. , 0.2, 0.2, 0.1],
[0.2, 0.2, 1.2, 0.7, 0.2, 0.2, 0. , 0.2, 0.2, 0. ],
[1.2, 0.1, 0.8, 2.1, 0.2, 0.1, 0. , 0.2, 0.1, 0.1],
[1.3, 0.3, 0.2, 2. , 0.2, 0.2, 0.1, 0.2, 0.1, 0. ],
[1.3, 0.3, 0.2, 2.2, 0.2, 0.8, 0.2, 0.2, 0.2, 0. ],
[1.2, 0.2, 0.2, 2.6, 0.2, 2. , 0.1, 0.2, 0.6, 0. ],
[1.2, 0.9, 0.2, 3.1, 1.9, 1.6, 0.1, 0.2, 0.5, 0.1]]
main_df = pd.DataFrame(mainList)
val_min = min(main_df.min())
x = np.arange(val_min, val_max, 1)
interval_list = []
if len(x)/2 == 0:
for i in range(0, len(x)):
x1 = list(x[i:i+2])
interval_list.append(x1)
else:
for i in range(0, len(x)-1):
x1 = list(x[i:i+2])
interval_list.append(x1)
half_open_intervalsList = []
for j in interval_list:
k = pd.Interval(j[0], j[1])
half_open_intervalsList.append(k)
半开区间的列表如下:
[(0.0, 1.0], (1.0, 2.0], (2.0, 3.0]]
如果值属于相同的区间,我想用区间的上界替换mainList/main_df的值。请注意,如果mainList中的值不属于这些间隔,则它们保持原样。
我尝试了下面的代码片段,但它没有输出outputList中给出的预期结果。
for ls in mainList:
for m in ls:
sub_list = []
for interval in range(0, len(half_open_intervalsList)):
if m in half_open_intervalsList[interval]:
#print(m)
z = main_df.replace(element, half_open_intervalsList[interval].right)
#sub_list.append(z)
outputList= [[1, 1, 1, 1, 1, 1, 0. , 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0. , 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0. , 1, 1, 0. ],
[1, 1, 1, 1, 1, 1, 0. , 1, 1, 1],
[1, 1, 2, 1, 1, 1, 0. , 1, 1, 0. ],
[2, 1, 1, 3, 1, 1, 0. , 1, 1, 1],
[2, 1, 1, 2 , 1, 1, 1, 1, 1, 0. ],
[2, 1, 1, 3, 1, 1, 1, 1, 1, 0. ],
[2, 1, 1, 3, 1, 2 , 1, 1, 1, 0. ],
[2, 1, 1, 3.1, 2, 2, 1, 1, 1, 1]]
您可以从半开区间列表中创建一个映射序列,然后使用.apply
+map
将dataframe中的值与映射序列中的相应值进行映射,最后将NaN
值(不能映射的值)填充为原始dataframe中的值:
m = pd.Series([i.right for i in half_open_intervalsList], half_open_intervalsList)
main_df.apply(lambda s: s.map(m)).fillna(main_df)
# OR main_df.stack().map(m).unstack().fillna(main_df)
0 1 2 3 4 5 6 7 8 9
0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0
3 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0
4 1.0 1.0 2.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0
5 2.0 1.0 1.0 3.0 1.0 1.0 0.0 1.0 1.0 1.0
6 2.0 1.0 1.0 2.0 1.0 1.0 1.0 1.0 1.0 0.0
7 2.0 1.0 1.0 3.0 1.0 1.0 1.0 1.0 1.0 0.0
8 2.0 1.0 1.0 3.0 1.0 2.0 1.0 1.0 1.0 0.0
9 2.0 1.0 1.0 3.1 2.0 2.0 1.0 1.0 1.0 1.0