我最近在这里问了一个关于大熊猫遗失值的问题,并且是针对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 …
我有一个包含两列的 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 位小数的精度,因为这些值稍后将用于做一些数学运算,我想使用我提供的确切值。
目的是使用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) 我有一个看起来像这样的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) 我尝试创建一个新功能来显示给定组的最小(最低)数据。
我的数据如下:
动物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_id
和cycle_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) 我有一个带有几列的 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 ?
对不起,如果这个问题很明显。
pandas ×6
python ×6
python-3.x ×2
apply ×1
dataframe ×1
decimal ×1
group-by ×1
loops ×1
performance ×1
plotly ×1