我有一个列表'abc'和一个数据帧'df':
abc = ['foo', 'bar']
df =
A B
0 12 NaN
1 23 NaN
Run Code Online (Sandbox Code Playgroud)
我想将列表插入单元格1B,所以我想要这个结果:
A B
0 12 NaN
1 23 ['foo', 'bar']
Run Code Online (Sandbox Code Playgroud)
我可以这样做吗?
1)如果我使用这个:
df.ix[1,'B'] = abc
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
ValueError: Must have equal len keys and value when setting with an iterable
Run Code Online (Sandbox Code Playgroud)
因为它试图将列表(有两个元素)插入行/列但不插入单元格.
2)如果我使用这个:
df.ix[1,'B'] = [abc]
Run Code Online (Sandbox Code Playgroud)
然后它插入一个只有一个元素是'abc'列表([['foo', 'bar']])的列表.
3)如果我使用这个:
df.ix[1,'B'] = ', '.join(abc)
Run Code Online (Sandbox Code Playgroud)
然后它插入一个字符串:( foo, bar)但不是列表.
4)如果我使用这个:
df.ix[1,'B'] = [', '.join(abc)]
Run Code Online (Sandbox Code Playgroud)
然后它插入一个列表,但它只有一个元素(['foo, bar'])但不是我想要的两个(['foo', 'bar']).
感谢帮助!
我的新数据框和旧列表:
abc = ['foo', …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种优雅的方法将所有行从一个DataFrame附加到另一个DataFrame(两个DataFrame具有相同的索引和列结构),但是如果两个DataFrame中都出现相同的索引值,请使用第二个数据中的行帧.
所以,例如,如果我开始:
df1:
A B
date
'2015-10-01' 'A1' 'B1'
'2015-10-02' 'A2' 'B2'
'2015-10-03' 'A3' 'B3'
df2:
date A B
'2015-10-02' 'a1' 'b1'
'2015-10-03' 'a2' 'b2'
'2015-10-04' 'a3' 'b3'
Run Code Online (Sandbox Code Playgroud)
我希望结果如下:
A B
date
'2015-10-01' 'A1' 'B1'
'2015-10-02' 'a1' 'b1'
'2015-10-03' 'a2' 'b2'
'2015-10-04' 'a3' 'b3'
Run Code Online (Sandbox Code Playgroud)
这类似于我认为在某些SQL系统中称为"upsert"的内容---更新和插入的组合,在某种意义上,每行来自df2(a)用于更新现有行,df1如果行键已经存在于df1,或(b)df1如果行密钥尚不存在则插入到末尾.
我想出了以下内容
pd.concat([df1, df2]) # concat the two DataFrames
.reset_index() # turn 'date' into a regular column
.groupby('date') # group rows by values in the 'date' column
.tail(1) …Run Code Online (Sandbox Code Playgroud) 我有一个包含一些(数百)百万行的数据帧.我想有效地将datetime转换为时间戳.我该怎么做?
我的样本df:
df = pd.DataFrame(index=pd.DatetimeIndex(start=dt.datetime(2016,1,1,0,0,1),
end=dt.datetime(2016,1,2,0,0,1), freq='H'))\
.reset_index().rename(columns={'index':'datetime'})
df.head()
datetime
0 2016-01-01 00:00:01
1 2016-01-01 01:00:01
2 2016-01-01 02:00:01
3 2016-01-01 03:00:01
4 2016-01-01 04:00:01
Run Code Online (Sandbox Code Playgroud)
现在我将datetime转换为timestamp value-by-value .apply()但是如果我有一些(几百万)行,则需要很长时间(几个小时):
df['ts'] = df[['datetime']].apply(lambda x: x[0].timestamp(), axis=1).astype(int)
df.head()
datetime ts
0 2016-01-01 00:00:01 1451602801
1 2016-01-01 01:00:01 1451606401
2 2016-01-01 02:00:01 1451610001
3 2016-01-01 03:00:01 1451613601
4 2016-01-01 04:00:01 1451617201
Run Code Online (Sandbox Code Playgroud)
以上结果就是我想要的.
如果我尝试使用当时的.dt访问器,pandas.Series我会收到错误消息:
df['ts'] = df['datetime'].dt.timestamp
Run Code Online (Sandbox Code Playgroud)
AttributeError:'DatetimeProperties'对象没有属性'timestamp'
如果我尝试创建例如.使用访问器的日期时间的日期部分.dt然后使用它更快.apply()!
df['date'] = df['datetime'].dt.date
df.head()
datetime …Run Code Online (Sandbox Code Playgroud) 我有一个数据帧(在Python 2.7中,pandas 0.15.0):
df=
A B C
0 NaN 11 NaN
1 two NaN ['foo', 'bar']
2 three 33 NaN
Run Code Online (Sandbox Code Playgroud)
我想对特定列中不包含NULL值的行应用简单函数.我的功能尽可能简单:
def my_func(row):
print row
Run Code Online (Sandbox Code Playgroud)
我的申请代码如下:
df[['A','B']].apply(lambda x: my_func(x) if(pd.notnull(x[0])) else x, axis = 1)
Run Code Online (Sandbox Code Playgroud)
它完美地运作.如果我想检查列'B'是否为NULL值,那么它也pd.notnull()可以完美地工作.但是,如果我选择包含列表对象的列'C':
df[['A','C']].apply(lambda x: my_func(x) if(pd.notnull(x[1])) else x, axis = 1)
Run Code Online (Sandbox Code Playgroud)
然后我收到以下错误消息: ValueError: ('The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()', u'occurred at index 1')
有人知道为什么pd.notnull()只适用于整数和字符串列而不适用于'列列'?
有没有更好的方法来检查列'C'中的NULL值而不是这个:
df[['A','C']].apply(lambda x: my_func(x) if(str(x[1]) != 'nan') …Run Code Online (Sandbox Code Playgroud) 什么是通过更多索引范围(例如by 10:12和25:28)对数据帧进行切片的pythonic方法?我希望以更优雅的方式:
df = pd.DataFrame({'a':range(10,100)})
df.iloc[[i for i in range(10,12)] + [i for i in range(25,28)]]
Run Code Online (Sandbox Code Playgroud)
结果:
a
10 20
11 21
25 35
26 36
27 37
Run Code Online (Sandbox Code Playgroud)
像这样的东西会更优雅:
df.iloc[(10:12, 25:28)]
Run Code Online (Sandbox Code Playgroud)
谢谢!
什么是正确的和最快的方式来读取数据卡珊德拉到熊猫吗?现在我使用以下代码,但它很慢......
import pandas as pd
from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
from cassandra.query import dict_factory
auth_provider = PlainTextAuthProvider(username=CASSANDRA_USER, password=CASSANDRA_PASS)
cluster = Cluster(contact_points=[CASSANDRA_HOST], port=CASSANDRA_PORT,
auth_provider=auth_provider)
session = cluster.connect(CASSANDRA_DB)
session.row_factory = dict_factory
sql_query = "SELECT * FROM {}.{};".format(CASSANDRA_DB, CASSANDRA_TABLE)
df = pd.DataFrame()
for row in session.execute(sql_query):
df = df.append(pd.DataFrame(row, index=[0]))
df = df.reset_index(drop=True).fillna(pd.np.nan)
Run Code Online (Sandbox Code Playgroud)
读取1000行需要1分钟,我有一点"更多"...如果我运行相同的查询,例如.在DBeaver中,我在一分钟内得到了整个结果(~40k行).
谢谢!!!
我想绘制y轴(水平网格线)的主要网格线,但我不想绘制垂直主网格线(x轴).相反,我想绘制垂直的小网格线.
我怎样才能做到这一点?
该ax.grid(which='major', linewidth=0)代码隐藏了垂直和水平主要网格线......
谢谢!
我有一个数据帧:
df <- data.frame('a'=c(1,2,3,4,5), 'b'=c(1,20,3,4,50))
df
a b
1 1 1
2 2 20
3 3 3
4 4 4
5 5 50
Run Code Online (Sandbox Code Playgroud)
我想基于现有列创建一个新列.像这样的东西:
if (df[['a']] == df[['b']]) {
df[['c']] <- df[['a']] + df[['b']]
} else {
df[['c']] <- df[['b']] - df[['a']]
}
Run Code Online (Sandbox Code Playgroud)
问题是if只检查第一行的条件...如果我从上面的if语句创建一个函数然后我使用apply()(或mapply()...),它是相同的.
在Python/pandas中我可以使用它:
df['c'] = df[['a', 'b']].apply(lambda x: x['a'] + x['b'] if (x['a'] == x['b']) \
else x['b'] - x['a'], axis=1)
Run Code Online (Sandbox Code Playgroud)
我希望在R中有类似的东西.所以结果看起来像这样:
a b c
1 1 1 2
2 …Run Code Online (Sandbox Code Playgroud) 我有这个系列:
ser=pd.Series([11,22,33,np.nan,np.datetime64('nat')],name='my_series')
Run Code Online (Sandbox Code Playgroud)
该系列看起来像这样:
0 11
1 22
2 33
3 NaN
4 NaN
Name: my_series, dtype: object
Run Code Online (Sandbox Code Playgroud)
但我只得到一个TrueNULL值:
ser.isnull()
0 False
1 False
2 False
3 True
4 False
Name: my_series, dtype: bool
Run Code Online (Sandbox Code Playgroud)
这是一个错误或如何正确计算熊猫系列中的NULL值?这没有帮助:
ser=ser.replace('NaN',np.nan)
Run Code Online (Sandbox Code Playgroud)
谢谢!
如何else在惯用的Python for循环中使用语句?没有else我可以写例如:
res = [i for i in [1,2,3,4,5] if i < 4]
Run Code Online (Sandbox Code Playgroud)
结果是: [1, 2, 3]
上述代码的正常形式是:
res = []
for i in [1,2,3,4,5]:
if i < 4:
res.append(i)
Run Code Online (Sandbox Code Playgroud)
结果与惯用形式相同: [1, 2, 3]
我想要这个:
res = [i for i in [1,2,3,4,5] if i < 4 else 0]
Run Code Online (Sandbox Code Playgroud)
我得到SyntaxError: invalid syntax.结果应该是:[1, 2, 3, 0, 0]
正常的代码是:
res = []
for i in [1,2,3,4,5]:
if i < 4:
res.append(i)
else:
res.append(0)
Run Code Online (Sandbox Code Playgroud)
结果是: [1, …