如何解决从数组中删除一行 根据评论和@wwii注释中的OP问题进行编辑:
我正在处理一个名为useEffect
的数组,该数组将分别由4列分别称为(x),(y),(z)的列创建,第四列在程序中使用。
我希望如果两行的x 和 y值重合,则根据它们的c,将从主数组中删除其中之一(“ 0” z值将删除“ 1” ”,则“ 1” z值将删除“ 2”,而“ 2” z值将删除“ 0”)。
原始数组如下:
numbers
问题是,当我尝试运行以下程序时,最后没有得到所需的数组。预期的输出数组如下所示:
[[12 15 2 0]
[65 23 0 0]
[24 66 2 0]
[65 23 1 0]
[24 66 0 0]]
我从下面的程序中摘录了
[[12 15 2 0]
[65 23 0 0]
[24 66 2 0]]
解决方法
如果可以使用熊猫,则可以执行以下操作:
x = np.array([[12,15,2,0],[65,23,1],[24,66,1,0]])
df = pd.DataFrame(x)
new_df = df.iloc[df.loc[:,(0,1)].drop_duplicates().index]
print(new_df)
0 1 2 3
0 12 15 2 0
1 65 23 0 1
2 24 66 2 0
它的作用如下:
- 将数组转换为熊猫数据帧
-
df.loc[:,1)].drop_duplicates().index
将返回您希望保留的行的索引(基于第一和第二列) -
df.iloc
将返回切片的数据帧。
根据评论和@wwii注释中的OP问题进行编辑:
-
您可以使用
.to_numpy()
返回numpy数组,所以只需执行arr = new_df.to_numpy()
-
您可以尝试以下操作:
xx = np.array([[12,0]]) df = pd.DataFrame(xx) df_new = df.groupby([0,group_keys=False).apply(lambda x: x.loc[x[2].idxmin()]) df_new.reset_index(drop=True,inplace=True) 0 1 2 3 0 12 15 2 0 1 24 66 0 0 2 65 23 0 0
在考虑一种特殊的启发式方法时,可以执行以下操作:
import pandas as pd
import numpy as np
def f_(x):
vals = x[2].tolist()
if len(vals)==2:
# print(vals)
if vals[0] == 0 and vals[1] == 1:
return vals[0]
elif vals[0] == 1 and vals[1] == 0:
return vals[1]
elif vals[0] == 1 and vals[1] == 2:
return vals[0]
elif vals[0] == 2 and vals[1] == 0:
return vals[0]
elif len(vals) > 2:
return -1
else:
return x[2]
xx = np.array([[12,group_keys=False).apply(lambda x: x.loc[x[2] == f_(x)])
df_new.reset_index(drop=True,inplace=True)
print(df_new)
0 1 2 3
0 12 15 2 0
1 24 66 2 0
2 65 23 0 0
,
测试数组
a = lifeforms = np.array([[12,[13,13,[14,14,2],[15,3,0]])
实现颜色选择的功能。
test_one = np.array([[0,[1,[2,1]])
test_two = np.array([[0,0]])
def f(g):
a = g.loc[:,2].unique()
if np.any(np.all(a == test_one,axis=1)):
idx = (g[2] == g[2].min()).idxmax()
elif np.any(np.all(a == test_two,axis=1)):
idx = (g[2] == g[2].max()).idxmax()
else:
raise ValueError('group colors outside bounds')
return idx
Groupby前两列;遍历团体;保存所需行的索引;使用这些索引从DataFrame中选择行。
df = pd.DataFrame(a)
gb = df.groupby([0,1])
indices = []
for k,g in gb:
if g.loc[:,2].unique().shape[0] > 2:
#print(f'(0,2) - dropping indices {g.index}')
continue
if g.shape[0] == 1:
indices.extend(g.index.to_list())
#print(f'unique - keeping index {g.index.values}')
continue
#print(g.loc[:,2])
try:
idx = f(g)
except ValueError as e:
print(sep)
print(e)
print(g)
print(sep)
continue
#print(f'keeping index {idx}')
indices.append(idx)
#print(sep)
print(df.loc[indices,:])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。