- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在寻找更好的解决方案来解决我在研究中遇到的数据处理问题。我有一个 Pandas DataFrame,我试图提取组(Frame)中特定列(Z)的所有值,保留不同列(名称)给出的 ID 对。最终结果不必再是 Pandas 对象,但最好完全在 Pandas 中完成此操作。通过示例可以最清楚地了解任务。
d=[['7500', '3.2900', '0', 'apple'],['7500', '-0.3500', '1', 'orange'],['7500', '-4.1400', '2', 'orange'],['7501', '3.4625', '0', 'apple'],['7501', '-0.2275', '1', 'apple'],['7501', '-4.1175', '2', 'orange'],['7502', '3.2087', '0', 'orange'],['7502', '-0.7313', '1', 'apple'],['7502', '-4.7513', '2', 'apple']]
df=pd.DataFrame(d, columns=["Frame","Z","Order","Name"])
>>> df
Frame Z Order Name
0 7500 3.2900 0 apple
1 7500 -0.3500 1 orange
2 7500 -4.1400 2 orange
3 7501 3.4625 0 apple
4 7501 -0.2275 1 apple
5 7501 -4.1175 2 orange
6 7502 3.2087 0 orange
7 7502 -0.7313 1 apple
8 7502 -4.7513 2 apple
因此,对于每个框架组,我想根据“顺序”列采用独特的组合,因此对于框架 7500 组,这将是:
(0,1)
(0,2)
(1,2)
但请注意,每组中的行数可以在 1 到 5 之间变化,而不仅仅是 0、1、2。然后我会跟踪这些对的“名称”值,
(apple, orange)
(apple, orange)
(orange, orange)
然后我会取出这些相应对的“Z”值,如下所示:
( 3.2900, -0.3500)
( 3.2900, -4.1400)
(-0.3500, -4.1400)
现在,最后,结合这些数据,我想要基于“名称”列的每个唯一对的两个列表。在本例中,我们将这些列表称为first_vals和second_vals,但这完全是任意的,
(apple, orange)
first_vals = [3.2900, 3.2900, ...]
second_vals = [-0.3500, -4.1400, ...]
(orange, orange)
first_vals = [-0.3500, ...]
second_vals = [-4.140, ...]
这是我使用字典想出的一个解决方案。它有效,但我认为它非常丑陋,并且隐藏了字典键中的数据结构。此示例依赖于按 Order 列对组进行预排序,但这实际上没有问题。
from itertools import combinations
from collections import defaultdict
zpairs = defaultdict(list)
for name, group in df.groupby(["Frame"]):
order_pairs = combinations(range(len(group)), 2)
zvals = group["Z"].values
rowids = group["Name"].values
for pair in order_pairs:
pair_str = str(rowids[pair[0]])+"-"+str(rowids[pair[1]])
zpairs[pair_str+"-first"].append(zvals[pair[0]])
zpairs[pair_str+"-second"].append(zvals[pair[1]])
该代码的结果如下所示:
>>> dict(zpairs)
{'apple-apple-first': ['3.4625', '-0.7313'],
'apple-apple-second': ['-0.2275', '-4.7513'],
'apple-orange-first': ['3.2900', '3.2900', '3.4625', '-0.2275'],
'apple-orange-second': ['-0.3500', '-4.1400', '-4.1175', '-4.1175'],
'orange-apple-first': ['3.2087', '3.2087'],
'orange-apple-second': ['-0.7313', '-4.7513'],
'orange-orange-first': ['-0.3500'],
'orange-orange-second': ['-4.1400']}
有没有一种方法可以处理我的数据框,不依赖字典,也不使用字典键来存储数据?这实际上并不是为了提高性能,但这会很有帮助。
最佳答案
这是一个分两步完成的 pandas 方法:
第 1 步
为了获取名称和 z 值对,我将编写一个辅助函数 get_group_pairs
,我将在执行 groupby
时调用该函数。我正在执行与您在循环中执行的操作类似的过程,但在 DataFrame
中返回输出:
def get_group_pairs(grp):
pairs = combinations(grp.index, 2)
data = [grp.loc[p, ('Name', 'Z')].values.flatten('F') for p in pairs]
return pd.DataFrame(data, columns=['Name1', 'Name2', 'Z1', 'Z2'])
namepairs = df.groupby('Frame').apply(get_group_pairs).reset_index(level=1, drop=True)
reset_index
纯粹是为了删除不必要的索引级别,以便中间输出看起来不错。如果您不关心中间输出,则没有必要。中间输出namepairs
:
Name1 Name2 Z1 Z2
Frame
7500 apple orange 3.2900 -0.3500
7500 apple orange 3.2900 -4.1400
7500 orange orange -0.3500 -4.1400
7501 apple apple 3.4625 -0.2275
7501 apple orange 3.4625 -4.1175
7501 apple orange -0.2275 -4.1175
7502 orange apple 3.2087 -0.7313
7502 orange apple 3.2087 -4.7513
7502 apple apple -0.7313 -4.7513
第 2 步
与步骤 1 中相同的辅助函数/groupby
/apply
模式。本质上,我只是使用两个名称进行分组,然后将两个 Z 列转换为列表:
def merge_zpairs(grp):
data = {'Z1': grp['Z1'].tolist(), 'Z2': grp['Z2'].tolist()}
return pd.Series(data)
zpairs = namepairs.groupby(['Name1', 'Name2']).apply(merge_zpairs).reset_index()
同样,reset_index
并不是绝对必要的。如果没有它,您将得到一个由名称对组成的 MultiIndex
。这将产生最终输出 zpairs
:
Name1 Name2 Z1 Z2
0 apple apple [3.4625, -0.7313] [-0.2275, -4.7513]
1 apple orange [3.2900, 3.2900, 3.4625, -0.2275] [-0.3500, -4.1400, -4.1175, -4.1175]
2 orange apple [3.2087, 3.2087] [-0.7313, -4.7513]
3 orange orange [-0.3500] [-4.1400]
组合代码
为方便起见,以下是步骤 1 和 2 中组合的代码:
def get_group_pairs(grp):
pairs = combinations(grp.index, 2)
data = [grp.loc[p, ('Name', 'Z')].values.flatten('F') for p in pairs]
return pd.DataFrame(data, columns=['Name1', 'Name2', 'Z1', 'Z2'])
def merge_zpairs(grp):
data = {'Z1': grp['Z1'].tolist(), 'Z2': grp['Z2'].tolist()}
return pd.Series(data)
namepairs = df.groupby('Frame').apply(get_group_pairs).reset_index(level=1, drop=True)
zpairs = namepairs.groupby(['Name1', 'Name2']).apply(merge_zpairs).reset_index()
获取字典
通过对步骤 2 的代码进行一些细微修改,您可以获得与您的类似的字典结构,尽管并不完全相同。本质上,不要使用 reset_index
,而是使用 to_dict
和 orient='index'
:
zpairs = namepairs.groupby(['Name1', 'Name2']).apply(merge_zpairs)
zpairs_dict = zpairs.to_dict(orient='index')
这会产生一个字典的字典:第一个键是一对名称,第二个键是您想要的 Z 值。例如,'apple-apple-first'
的语法为:
zpairs_dict[('apple', 'apple')]['Z1']
关于python - 如何使用 Pandas 处理行对并在没有字典的情况下保留 ID 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37554460/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!