- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我注意到分配给 pandas
DataFrame
列(使用 .loc
索引器)的行为因其他列的不同而不同出现在 DataFrame
中并以赋值的确切形式出现。使用三个示例 DataFrame
:
df1 = pandas.DataFrame({
'col1': [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
})
# col1
# 0 [1, 2, 3]
# 1 [4, 5, 6]
# 2 [7, 8, 9]
df2 = pandas.DataFrame({
'col1': [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
'col2': [[10, 20, 30], [40, 50, 60], [70, 80, 90]]
})
# col1 col2
# 0 [1, 2, 3] [10, 20, 30]
# 1 [4, 5, 6] [40, 50, 60]
# 2 [7, 8, 9] [70, 80, 90]
df3 = pandas.DataFrame({
'col1': [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
'col2': [1, 2, 3]
})
# col1 col2
# 0 [1, 2, 3] 1
# 1 [4, 5, 6] 2
# 2 [7, 8, 9] 3
x = numpy.array([[111, 222, 333],
[444, 555, 666],
[777, 888, 999]])
我发现了以下内容:
df1
:
df1.col1 = x
结果:
df1
# col1
# 0 111
# 1 444
# 2 777
df1.loc[:, 'col1'] = x
结果:
df1
# col1
# 0 111
# 1 444
# 2 777
df1.loc[0:2, 'col1'] = x
结果:
# […]
# ValueError: could not broadcast input array from shape (3,3) into shape (3)
df2
:
df2.col1 = x
结果:
df2
# col1 col2
# 0 111 [10, 20, 30]
# 1 444 [40, 50, 60]
# 2 777 [70, 80, 90]
df2.loc[:, 'col1'] = x
结果:
df2
# col1 col2
# 0 111 [10, 20, 30]
# 1 444 [40, 50, 60]
# 2 777 [70, 80, 90]
df2.loc[0:2, 'col1'] = x
结果:
# […]
# ValueError: could not broadcast input array from shape (3,3) into shape (3)
df3
:
df3.col1 = x
结果:
df3
# col1 col2
# 0 111 1
# 1 444 2
# 2 777 3
df3.loc[:, 'col1'] = x
结果:
# ValueError: Must have equal len keys and value when setting with an ndarray
df3.loc[0:2, 'col1'] = x
结果:
# ValueError: Must have equal len keys and value when setting with an ndarray
因此,如果 DataFrame
中的其他列之一没有 dtype object
,那么 df.loc
似乎表现不同。
我的问题是:
ValueError
的情况下,DataFrame
列中填充了第一列 numpy
数组?注意:我不想讨论以这种方式将列分配给 numpy
数组是否有意义。我只想知道行为上的差异,以及这是否算作错误。
最佳答案
Why would the presence of other columns make a difference in this kind of assignment?
答案很简单,因为 Pandas 检查数据框中的混合类型。您可以使用源代码中使用的相同方法自行检查:
print(df1._is_mixed_type) # False
print(df2._is_mixed_type) # False
print(df3._is_mixed_type) # True
使用的逻辑因 _is_mixed_type
的值而异。具体来说,当您提供的输入的 _is_mixed_type
为 True
时,_setitem_with_indexer
中的以下测试失败:
if len(labels) != value.shape[1]:
raise ValueError('Must have equal len keys and value '
'when setting with an ndarray')
换句话说,数组中的列数多于数据框中要分配给的列数。
这是一个错误吗?在我看来,在 Pandas 数据框中使用任何列表或数组都充满了危险。1 添加了 ValueError
检查以解决一个更重要的问题 ( GH 7551 ) .
Why are the different versions of the assignment not equivalent?
通过 df3['col1'] = x
进行赋值的原因是因为 col1
是一个现有系列。尝试 df3['col3'] = x
,您的代码将因 ValueError
而失败。
深入挖掘,datframe 的 __setitem__
方法(df[]
是语法糖)将 'col1'
标签转换为通过 key = com._apply_if_callable(key, self)
的系列(如果存在):
def _apply_if_callable(maybe_callable, obj, **kwargs):
"""
Evaluate possibly callable input using obj and kwargs if it is callable,
otherwise return as it is
"""
if callable(maybe_callable):
return maybe_callable(obj, **kwargs)
return maybe_callable
然后逻辑可以回避 _setitem_with_indexer
中的检查逻辑。您可以推断出这一点,因为当我们为现有系列提供标签时,我们会跳转到 _setitem_array
而不是 _set_item
:
def __setitem__(self, key, value):
key = com._apply_if_callable(key, self)
if isinstance(key, (Series, np.ndarray, list, Index)):
self._setitem_array(key, value)
elif isinstance(key, DataFrame):
self._setitem_frame(key, value)
else:
self._set_item(key, value)
以上均为实现细节;你不应该基于这些底层方法来构建你的 Pandas 语法,因为它们可能会在未来发生变化。
1 我什至会说它应该被禁用 默认 并且只能通过设置启用。这是一种非常低效的存储和操作数据的方式。有时它提供了短期的便利,但以混淆代码为代价。
关于python - 将 rank 2 numpy 数组分配给 pandas DataFrame 列的行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52080334/
我想创建一个基于 jQuery 的非常简单的 html 编辑器(不是所见即所得)。 我的问题是如何制作 textarea或 div可能 在上面写一些文字 然后样式即标签(例如 some stuff 将
根据文档 isset 条款“测试此项目中是否已设置给定属性”。我不明白设置属性时 isset 返回 true 还是 false 在下面的代码片段中,当 env.JAVA_HOME 未设置时,java.
我正在尝试取消映射 o这是执行 :only 的默认命令( :help :only ),所以我尝试的第一件事是: nmap o 这种作品,除非我按 ,等待超过timeoutlen ms 然后按 o
我有以下型号: class MetaData(models.Model): created_at = models.DateTimeField(auto_now_add=True, auto_
下面列出了两行代码。两者对日期和时间的期望相同,但只有一个有效。我正在使用 R 3.1。 以下不起作用: DateTime2=strftime("08/13/2010 05:26:24.350", f
我有一个关于 C 代码的问题。 #include void foo(void){ int a; printf("%d\n",a); } void bar(void){
如果文件大小 > 8k,为什么读取的最后一个字节 = 0? private static final int GAP_SIZE = 8 * 1024; public static void main(
我有一个命令 Get-Testdata从不同来源检索测试数据并将这些数据存储到 PSObject以不同的值作为属性。然后将对象总数存储为数组,以便于操作、排序、计算等。 我的问题是我希望能够将这些数据
我正在使用 epoll 将大消息写入使用 HTTP 协议(protocol)的服务器。 fds 都设置为非阻塞,我正在使用边缘触发事件。我知道对于 EPOLLIN,我需要循环读取 fd,直到返回 EA
这对我来说听起来很奇怪: $test_1 = 'string'; $test_2 = '0'; var_dump(intval($test_1)); // Output: int 0 var_dump
这个问题在这里已经有了答案: Java: Integer equals vs. == (7 个回答) 7年前关闭。 请您解释以下行为。 public class EqAndRef { publ
Drupal 的行为到底是什么? 它为模块开发人员提供什么类型的服务层? 它映射到 jQuery.ready 的关系类型是什么? 最佳答案 长版:Drupal.behaviors 不仅仅是 jQuer
以下代码: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ for (int i=0
人们可以将项目添加到数据库中。我让他们选择在此时添加它,或手动选择日期。 因此我得到了这个 HTML 结构。 (请注意,我将日期和时间选择器妥协为只有一行文本) Selec
创建了一个数据框: simpleDF is.na(simpleDF$vals) [1] TRUE TRUE FALSE > is.nan(simpleDF$vals) [1] FALSE TRU
我有一个大的 docker 镜像 A,我创建了一个新的 Dockerfile FROM A RUN rm /big-folder 我尝试使用以下方法构建图像: docker build --squas
我想知道以下情况下 JVM 的行为是什么: JVM 最小堆大小 = 500MB JVM 最大堆大小 = 2GB 操作系统有 1GB 内存 JVM启动后,程序运行一段时间后,使用内存超过1GB。我想知道
我们正在使用 spikeearrest 策略,但我们不了解其工作原理。峰值逮捕配置如下: 5pm 阅读文档,我们了解到,如果我们在一分钟内调用此流超过 5 次,则该策略将在第 5 次之后
我正在使用 cURL 发送 POST 请求: curl http://tarvos.local:8080/partial_Users/2 -d '{currentPage : 1, firstID :
我的表中有 6442670 条记录,我正在使用以下命令获取它们jdbctemplate 使用行号一次 1000000 个。以下是查询 select * from (select rowNum rn
我是一名优秀的程序员,十分优秀!