小编rag*_*esz的帖子

Python pandas将列表插入到单元格中

我有一个列表'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)

python list insert dataframe pandas

80
推荐指数
5
解决办法
8万
查看次数

pandas DataFrame concat/update("upsert")?

我正在寻找一种优雅的方法将所有行从一个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)

python pandas

24
推荐指数
2
解决办法
5019
查看次数

Python pandas通过dt访问器有效地将datetime转换为时间戳

我有一个包含一些(数百)百万行的数据帧.我想有效地将​​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 datetime timestamp pandas

24
推荐指数
4
解决办法
3万
查看次数

如果列值不为NULL,Python pandas将应用函数

我有一个数据帧(在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)

python null list apply pandas

22
推荐指数
3
解决办法
5万
查看次数

Python pandas按多个索引范围切片数据帧

什么是通过更多索引范围(例如by 10:1225: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)

谢谢!

python indexing slice pandas

17
推荐指数
2
解决办法
1万
查看次数

Python将Cassandra数据读入熊猫

什么是正确的和最快的方式来读取数据卡珊德拉到熊猫吗?现在我使用以下代码,但它很慢......

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行).

谢谢!!!

python cassandra pandas

17
推荐指数
2
解决办法
7705
查看次数

Python matplotlib仅显示水平主要和垂直次要网格线

我想绘制y轴(水平网格线)的主要网格线,但我不想绘制垂直主网格线(x轴).相反,我想绘制垂直的小网格线.

我怎样才能做到这一点?

ax.grid(which='major', linewidth=0)代码隐藏了垂直和水平主要网格线......

谢谢!

python grid matplotlib

12
推荐指数
1
解决办法
2万
查看次数

Dataframe基于其他列创建新列

我有一个数据帧:

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)

r apply dataframe

10
推荐指数
4
解决办法
4万
查看次数

Python pandas .isnull()不适用于对象dtype中的NaT

我有这个系列:

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)

谢谢!

python datetime isnull pandas

8
推荐指数
2
解决办法
7178
查看次数

python惯用python for循环if else语句

如何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, …

python for-loop if-statement idiomatic

8
推荐指数
1
解决办法
3560
查看次数