Advanced Python Pandas

Merging DataFrames

语法如下:
merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False)

参数说明:

  1. left 与 right:两个不同的 DataFrame
  2. how:指的是合并(连接)的方式有 inner(内连接), left(左外连接), right(右外连接), outer(全外连接); 默认为 inner
  3. on: 指的是用于连接的列索引名称。必须存在右右两个 DataFrame 对象中,如果没有指定且其他参数也未指定则以两个 DataFrame 的列名交集做为连接键
  4. left_on:左则 DataFrame 中用作连接键的列名;这个参数中左右列名不相同,但代表的含义相同时非常有用。
  5. right_on:右则 DataFrame 中用作 连接键的列名
  6. left_index:使用左则 DataFrame 中的行索引做为连接键
  7. right_index:使用右则 DataFrame 中的行索引做为连接键
  8. sort:默认为 True,将合并的数据进行排序。在大多数情况下设置为 False 可以提高性能
  9. suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为 ('_x','_y')
  10. copy:默认为 True,总是将数据复制到数据结构中;大多数情况下设置为False可以提高性能
  11. indicator:在 0.17.0 中还增加了一个显示合并数据中来源情况;如只来自己于左边(left_only)、两者(both)

Idiomatic Pandas: Making Code Pandorable

用连续的函数加换行增加代码的可读性:
(df.where(df['SUMLEV']==50)
.dropna()
.set_index(['STNAME','CTYNAME'])
.rename(columns={'ESTIMATESBASE2010': 'Estimates Base 2010'}))

注意到,给 column 重命名的代码:df.rename(column={'original_name': 'new_name'})

Group by

  • 遍历 groupby,用for group, frame in df.groupby('NAME’),group 是分组的依据,如果 ’NAME’ 是一个函数,那么 group 就是 return 的值;frame 是每一个 NAME 后面的 DataFrame。要数每一个的个数,就用 len(frame)
  • groupby(level=0), if the axis is a MultiIndex (hierarchical), group by a particular level or levels.
  • df.groupby('Category').apply(lambda df,a,b: sum(df[a] * df[b]), 'Weight (oz.)', 'Quantity'). It uses function on certain column and output after groupby.

Scales

  • Ratio scale: units are equally spaced; mathematical operations of +-*/ is valid. e.g. weight and height.
  • Interval scale: units are equally spaced; it cannot use operations of * and /. e.g. 1-5 in the questionnaire.
  • Ordinal scale: the order of units are important but not evenly spaced. e.g. letter grade A+, A and A-.
  • Nominal scale: category of data, but category has no order. e.g. teams of a sport.
  • df['Grades'].astype('category'), transfer to categorical data. Or, grades = df['Grades'].astype('category', categories=['D', 'D+', 'C-', 'C', 'C+', 'B-', 'B', 'B+', 'A-', 'A', 'A+'], ordered=True), make category in ascending order.
  • s = pd.Series([168, 180, 174, 190, 170, 185, 179, 181, 175, 169, 182, 177, 180, 171]). Use pd.cut to bin this data into 3 bins (we can also label them): pd.cut(s, 3, labels=['Small', 'Medium', 'Large']).

Pivot Tables

语法如下:
pivot_table(df, values=, index=, columns=, aggfunc=np.mean, margins=False)

if margins=True, special All(default is np.mean) columns and rows will be added with partial group aggregates.

Date Functionality

  • Timestamp: pd.Timestamp('9/1/2016 10:05AM')

  • Period: pd.Period('1/2016') or pd.Period('3/5/2016')

  • Datetime index: pd.Series(list('abc'), [pd.Timestamp('2016-09-01'), pd.Timestamp('2016-09-02'), pd.Timestamp('2016-09-03')])

output:
2016-09-01 a
2016-09-02 b
2016-09-03 c
dtype: object

  • Similarly, period index: pd.Series(list('def'), [pd.Period('2016-09'), pd.Period('2016-10'), pd.Period('2016-11')])
  • Converting to datetime: pd.to_datetime(arg, dayfirst=False, yearfirst=False)
  • Timedeltas: pd.Timestamp('9/2/2016 8:10AM') + pd.Timedelta('12D 3H')

Working with Dates in Dataframe

  • Date range: pd.date_range(start=None, end=None, periods=None, freq=’D’, tz=None, normalize=False, name=None, closed=None).

  • freq: (freq aliases in the attachment image)

  • tz: Time zone name for returning localized DatetimeIndex, for example Asia/Hong_Kong.

  • closed: Make the interval closed with respect to the given frequency to the ‘left’, ‘right’, or both sides (None).

  • Example: dates = pd.date_range('10-01-2016', periods=9, freq='2W-SUN')

  • 查看 index 分别是星期几:df.index.weekday_name.

  • 直接进行差分,比如求 return:df.diff().

  • Resample: df.resample(rule, fill_method=None, closed=None, label=None). closed/lable: ‘left’ or ‘right’.

  • Example: 归总求每个月的均值 df.resample('M').mean().

  • Query with date: df['2016-12'] or df['2016-12':].

  • 重新排列 freq: df.asfreq(freq, method=None). Method=‘bfill’/‘ffill’.

Other

  • 把 DataFrame 里的 a 换成 b:df.replace('a', 'b')
  • 替换 DataFrame 里有一定规律的字符串:. 代表任意字符; * 代表 0 个以上重复字符; + 代表 1 个以上重复字符; [] 表示 list 里面出现的都替换掉;具体参见文档字符串说明
  • Groupby 以后计数或求均值等:gourpby('column_A').agg({'column_B': ['size', 'sum'], 'column_C':['count', 'mean', 'max']})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容