我想创建一个列,其中的最大值介于从数据框的其他列计算得出的 2 个值之间。
import pandas as pd
df = pd.DataFrame({"A": [1,2,3], "B": [-2, 8, 1]})
df['Max Col'] = max(df['A']*3, df['B']+df['A'])
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Run Code Online (Sandbox Code Playgroud)
期望的结果是一个新的 df 列 ['Max Col'],其中包含上述计算的最大值。
我知道有一个很长的解决方案,即通过计算创建两个新列,然后应用.max(axis=1)。我正在寻找一个直接的解决方案。
谢谢。
尝试将pandas'数据帧写入时sql-server,出现此错误:
DatabaseError:在SQL'SELECT name FROM sqlite_master WHERE type ='table'AND name = ?;'上执行失败;(:('42S02',“ [42S02] [Microsoft] [SQL Server Native Client 11.0] [SQL Server]无效的对象名'sqlite_master'。(208)(SQLExecDirectW); [42000] [Microsoft] [SQL Server本机客户端11.0] [SQL Server]声明无法准备。(8180)“)
似乎pandas正在寻找sqlite而不是真正的数据库。
这不是一个连接问题,因为我可以从阅读sql-server与使用相同的连接pandas.read_sql
已使用设置连接
sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
Run Code Online (Sandbox Code Playgroud)
这也不是数据库权限问题,因为我可以使用与以下相同的连接参数逐行编写:
cursor = conn.cursor()
cursor.execute('insert into test values (1, 'test', 10)')
conn.commit()
Run Code Online (Sandbox Code Playgroud)
我可以编写一个循环逐行插入一个循环,但是我想知道为什么to_sql它对我不起作用,我深信它不会那么有效。
环境::
Python2.7
Pandas:0.20.1
sqlalchemy:1.1.12
提前致谢。
可运行的示例:
import pandas as pd
from sqlalchemy import create_engine
import urllib
params = …Run Code Online (Sandbox Code Playgroud) 使用Pandas更新行的特定子集的列的值时,最佳方法是什么?
简单的例子:
import pandas as pd
df = pd.DataFrame({'name' : pd.Series(['Alex', 'John', 'Christopher', 'Dwayne']),
'value' : pd.Series([1., 2., 3., 4.])})
Run Code Online (Sandbox Code Playgroud)
目标:value根据名称长度和value列本身的初始值更新该列。
以下代码实现了目标:
df.value[df.name.str.len() == 4 ] = df.value[df.name.str.len() == 4] * 1000
Run Code Online (Sandbox Code Playgroud)
但是,此行在LHS和RHS中两次对整个数据帧进行过滤。我认为这不是最有效的方法。它并没有做到“就地”。
基本上我正在寻找与R data.table':='运算符等效的熊猫:
df[nchar(name) == 4, value := value*1000]
Run Code Online (Sandbox Code Playgroud)
对于其他类型的操作,例如:
df[nchar(name) == 4, value := paste0("short_", as.character(value))]
Run Code Online (Sandbox Code Playgroud)
环境: Python 3.6 Pandas 0.22
提前致谢。
我希望在 Pandas 数据框中创建一个新列,其中包含由 df 行值过滤的列表值。
df = pd.DataFrame({'Index': [0,1,3,2], 'OtherColumn': ['a', 'b', 'c', 'd']})
Index OtherColumn
0 a
1 b
3 c
2 d
l = [1000, 1001, 1002, 1003]
Run Code Online (Sandbox Code Playgroud)
期望的输出:
Index OtherColumn Value
0 a -
1 b -
3 c 1003
2 d -
Run Code Online (Sandbox Code Playgroud)
我的代码:
df.loc[df.OtherColumn == 'c', 'Value'] = l[df.Index]
Run Code Online (Sandbox Code Playgroud)
它返回错误,因为 'df.Index' 不被识别为 int 而是一个列表(不是由 OtherColumn == 'c' 过滤)。
对于 R 用户,我正在寻找:
df[OtherColumn == 'c', Value := l[Index]]
Run Code Online (Sandbox Code Playgroud)
谢谢。