小编Chr*_*ris的帖子

为什么熊猫在NaN上合并?

我最近在这里问了一个关于大熊猫遗失值的问题,并且是针对github问题的.阅读完该页面和缺少的数据文档.

我想知道为什么merge并且join当"他们不比较平等"时将NaNs视为匹配:np.nan != np.nan

# merge example
df = pd.DataFrame({'col1':[np.nan, 'match'], 'col2':[1,2]})
df2 = pd.DataFrame({'col1':[np.nan, 'no match'], 'col3':[3,4]})
pd.merge(df,df2, on='col1')

    col1    col2    col3
0   NaN      1       3

# join example with same dataframes from above
df.set_index('col1').join(df2.set_index('col1'))

      col2  col3
col1        
NaN     1   3.0
match   2   NaN
Run Code Online (Sandbox Code Playgroud)

但是,NaNs groupby排除在外:

df = pd.DataFrame({'col1':[np.nan, 'match', np.nan], 'col2':[1,2,1]})
df.groupby('col1').sum()

       col2
col1    
match   2
Run Code Online (Sandbox Code Playgroud)

当然你也可以dropna()或者df[df['col1'].notnull()]不过我很好奇,为什么NaN是排除像一些熊猫的操作groupby,而不是其他人一样merge,join …

python python-3.x pandas

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

设置数据类型为 Decimal 的 Pandas 数据框列的小数精度

我有一个包含两列的 Pandas 数据框,col 1 带有文本,col 2 带有十进制值。

钥匙 价值
一种 1.2089
5.6718
7.3084

我使用 '.apply' 函数将值列的数据类型设置为 Decimal(Python Decimal 库)。执行此操作后,值列将从 4 个小数位值变为 43 个小数位。我试图使用 .getcontect.prec = 4 无济于事。

数据框是通过读取与上表格式相同的 CSV 文件构建的。值列中的所有十进制数仅保留 4 位小数。

import pandas as pd
from decimal import *

def get_df(table_filepath):
    df = pd.read_csv(table_filepath)
    getcontect.prec = 4
    df['Value'] = df['Value'].apply(Decimal)
Run Code Online (Sandbox Code Playgroud)

上面的代码是我尝试过的,但仍然导致输出的值列值具有 43 个小数位,而不是从 csv 文件读取的每个值应具有的 4 个小数位。

打印数据框时得到的结果是:

钥匙 价值
一种 1.20890000000003046807250939309597015380859375
5.67180000000000318323145620524883270263671875
7.30838399999999969077180139720439910888671875

我只想要 4 位小数的精度,因为这些值稍后将用于做一些数学运算,我想使用我提供的确切值。

python decimal pandas

6
推荐指数
2
解决办法
2722
查看次数

从Plotly的DataFrame列中添加多个文本标签

目的是使用plotly文本参数包含多个列的位置绘制一些数据。

这是我的DataFrame:

import pandas as pd
import numpy as np
import plotly as py
import plotly.graph_objs as go

np.random.seed(1)
df = pd.DataFrame({'Mean Age': np.random.randint(40,60,10),
                   'Percent': np.random.randint(20,80,10),
                   'Number Column': np.random.randint(100,500,10)},
                  index=list('ABCDEFGHIJ'))

df.index.name = 'Text Column'
df = df.sort_values('Mean Age')
Run Code Online (Sandbox Code Playgroud)

这是一个示例,该示例显示了如何绘制带有一列文本的数据以在悬停时显示:

# trace for Percent
trace0 = go.Scatter(
    x = df.index,
    y = df['Percent'],
    name = 'Percent',
    text = df['Mean Age'], # text to show on hover from df column
    mode = 'lines+markers',
    line = dict(
        color = ('rgb(0,0,255)'), # …
Run Code Online (Sandbox Code Playgroud)

python python-3.x pandas plotly

5
推荐指数
1
解决办法
323
查看次数

Pandas转换('unique')输出为逗号分隔字符串而不是列表

我有一个看起来像这样的DataFrame:

df = pd.DataFrame({'ID':[1,1,2,2,3,4],'Name':['John Doe','Jane Doe','John Smith','Jane Smith','Jack Hill','Jill Hill']})

    ID  Name
0   1   John Doe
1   1   Jane Doe
2   2   John Smith
3   2   Jane Smith
4   3   Jack Hill
5   4   Jill Hill
Run Code Online (Sandbox Code Playgroud)

然后我按ID添加了另一个列分组并获取Name中的唯一值:

df['Multi Name'] = df.groupby('ID')['Name'].transform('unique')

    ID  Name    Multi Name
0   1   John Doe    [John Doe, Jane Doe]
1   1   Jane Doe    [John Doe, Jane Doe]
2   2   John Smith  [John Smith, Jane Smith]
3   2   Jane Smith  [John Smith, Jane Smith]
4   3   Jack …
Run Code Online (Sandbox Code Playgroud)

python group-by dataframe pandas pandas-groupby

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

返回 pandas groupby 中的第一个日期

我尝试创建一个新功能来显示给定组的最小(最低)数据。

我的数据如下:

动物ID 周期号 提要日期 开始日期周期
1 A 2021-02-06 2020-09-20
1 A 2021-02-10 2020-09-20
1 2021-02-14 2020-09-20
2 A 2021-02-20 2020-09-30
2 A 2021-02-21 2020-09-30

对于每一个animal_idcycle_nr,我都想返回第一个feed_date

我想要的 df 看起来像这样

动物ID 周期号 提要日期 开始日期周期 首次推送日期
1 A 2021-02-06 2020-09-20 2021-02-06
1 A 2021-02-10 2020-09-20 2021-02-06
1 2021-02-14 2020-09-20 2021-02-14
2 A 2021-02-20 2020-09-30 2021-02-20
2 A 2021-02-21 2020-09-30 2021-02-20

我尝试了多种方法,但这些选项都没有返回正确的值:

df['first_feed_date'] = df.groupby(['animal_id', 'cycle_nr']).agg({'feed_date' : np.min})
df['first_feed_date'] = df.loc[df.groupby(['animal_id', 'cycle_nr'])['feed_date'].idxmin()]
df['first_feed_date']= df.groupby(["animal_id", "cycle_nr"])["feed_date"].transform(min) …
Run Code Online (Sandbox Code Playgroud)

python pandas pandas-groupby

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

Pandas 数据框避免遍历列和行

我有一个带有几列的 df,看起来有点像这样:

一种 C
NaN 3 2
6 4 NaN
2 4 NaN
1 NaN NaN
NaN NaN NaN
... ... ...

我现在想创建一个新列,它是列 'A' 乘以标量 ( df['D'] = df['A']*3 ),但仅适用于没有 NaN 的那些行。在有 NaN 值的行中,我想使用 B 列的同一行,如果还有 NaN 我想使用 C 列,依此类推。如果所有列都有 NaN,则该值也应该是 NaN。

我可以使用 for 循环,逐行检查上述 if 语句,但这对于大 df 来说似乎非常低效。有没有更有效的方法可以在这里使用?也许以某种方式使用 df.apply ?

对不起,如果这个问题很明显。

python performance loops apply pandas

0
推荐指数
1
解决办法
37
查看次数