pandas笔记

1.1. 创建Series

  • 从字典创建
prices&#xA0;=&#xA0;{<span class="hljs-string">'apple'</span>:<span class="hljs-number">4.99</span>,<br>&#xA0;&#xA0;<span class="hljs-string">'banana'</span>:<span class="hljs-number">1.99</span>,<br>&#xA0;&#xA0;<span class="hljs-string">'orange'</span>:<span class="hljs-number">3.99</span>,<br>&#xA0;&#xA0;<span class="hljs-string">'grapes'</span>:<span class="hljs-number">0.99</span>}<br>ser&#xA0;=&#xA0;pd.Series(prices)
  • 从标量创建
ser&#xA0;=&#xA0;pd.Series(<span class="hljs-number">2</span>,index&#xA0;=&#xA0;range(<span class="hljs-number">0</span>,<span class="hljs-number">5</span>))
ser&#xA0;=&#xA0;pd.Series(range(<span class="hljs-number">1</span>,<span class="hljs-number">15</span>,<span class="hljs-number">3</span>),index=[x&#xA0;<span class="hljs-keyword">for</span>&#xA0;x&#xA0;<span class="hljs-keyword">in</span>&#xA0;<span class="hljs-string">'abcde'</span>])
<span class="hljs-keyword">import</span>&#xA0;random<br>ser&#xA0;=&#xA0;pd.Series(random.sample(range(<span class="hljs-number">100</span>),<span class="hljs-number">6</span>))
<span class="hljs-keyword">import</span>&#xA0;pandas&#xA0;<span class="hljs-keyword">as</span>&#xA0;pd<br>a&#xA0;=[<span class="hljs-number">1</span>,<span class="hljs-number">3</span>,<span class="hljs-number">5</span>,<span class="hljs-number">7</span>]<br>a&#xA0;=&#xA0;pd.Series(a,name&#xA0;=<span class="hljs-string">'JOE'</span>)<br>a&#xA0;=&#xA0;pd.DataFrame(a)

1.2. 提取元素

<span class="hljs-keyword">import</span>&#xA0;pandas&#xA0;<span class="hljs-keyword">as</span>&#xA0;pd<br><span class="hljs-keyword">import</span>&#xA0;random<br><br>x&#xA0;=&#xA0;random.sample(range(<span class="hljs-number">100</span>),<span class="hljs-number">10</span>)<br>print(x)<br>y&#xA0;=&#xA0;pd.Series(x)<br>print(y)<br>print(<span class="hljs-string">"=============================="</span>)<br>print(y[y><span class="hljs-number">40</span>])
x=random.sample(range(<span class="hljs-number">100</span>),<span class="hljs-number">10</span>)<br>print(x)<br>y&#xA0;=&#xA0;pd.Series(x)<br>print(y[[<span class="hljs-number">2</span>,<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">2</span>]])
<span class="hljs-function"><span class="hljs-keyword">def</span>&#xA0;<span class="hljs-title">joe</span><span class="hljs-params">(x)</span>:</span><br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">return</span>&#xA0;x&#xA0;+<span class="hljs-number">10</span><br>x&#xA0;=&#xA0;random.sample(range(<span class="hljs-number">100</span>),<span class="hljs-number">10</span>)<br>print(<span class="hljs-string">'Data&#xA0;=>&#xA0;'</span>,x,<span class="hljs-string">'\n'</span>)<br>y&#xA0;=&#xA0;pd.Series(x)<br>print(<span class="hljs-string">'Applying&#xA0;pow&#xA0;=>&#xA0;\n'</span>&#xA0;,pow(y,<span class="hljs-number">2</span>),<span class="hljs-string">'\n'</span>)<br>print(<span class="hljs-string">'Applying&#xA0;joe&#xA0;=>&#xA0;\n'</span>,joe(y))
x&#xA0;=&#xA0;pd.Series(range(<span class="hljs-number">1</span>,<span class="hljs-number">8</span>),index=[x&#xA0;<span class="hljs-keyword">for</span>&#xA0;x&#xA0;<span class="hljs-keyword">in</span>&#xA0;<span class="hljs-string">'abcdefg'</span>])<br>print(x,<span class="hljs-string">'\n'</span>)<br>print(<span class="hljs-string">'Is&#xA0;"j"&#xA0;in&#xA0;x?&#xA0;'</span>,<span class="hljs-string">'j'</span>&#xA0;<span class="hljs-keyword">in</span>&#xA0;x)<br>print(<span class="hljs-string">'Is&#xA0;"d"&#xA0;in&#xA0;x?&#xA0;'</span>,&#xA0;<span class="hljs-string">'d'</span>&#xA0;<span class="hljs-keyword">in</span>&#xA0;x)

2.1. 选择定位

  • loc方法:通过行索引 “index” 中的具体值来取行数据(如取”Index”为”A”的行)
  • iloc方法:通过行号来取行数据(如取第二行的数据)
  • 选取某几列: df.iloc[:,[0,3,5,1]]
  • 利用loc函数的时候,当index相同时,会将相同的Index全部提取出来,优点是:如果index是人名,数据框为所有人的数据,那么我可以将某个人的多条数据提取出来分析;缺点是:如果index不具有特定意义,而且重复,那么提取的数据需要进一步处理,可用.reset_index()函数重置index
  • 注意,此处设置索引时,直接 .set_index('XXX') 不行,必须这样: df = df.set_index('XXX') 才能生效。
  • 或者,可以这样: .set_index('XXX', inplace = True])
  • 使用点符号。
  • data.Area.head()
  • 如果选取的结果是dataframe,则列或行要表示成列表形式。
  • data[['column_name_1', 'column_name_2']]

  • idxmax() 可以获取原df中最大值的索引

  • contb.groupby('cand_nm',as_index=False)[['contb_receipt_amt']].max().index() 获取的是生成的新df的索引(即从0开始)
  • contb.groupby('cand_nm')[['contb_receipt_amt']].max().index() 获取df是以 cand_nm 为索引

综上,想要获取每个候选人获取单笔献金最大值的索引,只能用 idxmax()方法。

但这种方法的缺点是,只能找到最大的捐赠者之一。如果候选人有多个金额相同的最大捐赠者,这种方法就不起作用。

[En]

But the drawback of this approach is that only one of the biggest donors can be found. This approach does not work if a candidate has multiple largest donors of the same amount.

下面的方法,用groupby找出每个候选人最大的捐赠额,然后用候选人和捐赠额作为条件,找出相对应的行。

df_max_donation&#xA0;=&#xA0;pd.DataFrame()<br>s&#xA0;=&#xA0;contb.groupby(<span class="hljs-string">'cand_nm'</span>)[<span class="hljs-string">'contb_receipt_amt'</span>].max()<br><span class="hljs-keyword">for</span>&#xA0;i&#xA0;<span class="hljs-keyword">in</span>&#xA0;range(s.size):<br>&#xA0;&#xA0;&#xA0;&#xA0;ex&#xA0;=&#xA0;<span class="hljs-string">'cand_nm&#xA0;==&#xA0;"%s"&#xA0;&&#xA0;contb_receipt_amt&#xA0;==&#xA0;%f'</span>&#xA0;%&#xA0;(s.index[i],&#xA0;s.values[i])<br>&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;df_max_donation&#xA0;=&#xA0;pd.concat([df_max_donation,contb.query(ex)],axis=<span class="hljs-number">0</span>,)<br>display(df_max_donation)

应该还有一种方法,将s(Series)转成dataframe,然后和contb进行join操作。 参见[[美国大选献金分析#^805156]]

2.2. 删除列

dt=data.drop(<span class="hljs-string">"Area"</span>,axis=<span class="hljs-number">1</span>,inplace=<span class="hljs-literal">True</span>)
  • axis=1,此操作影响列,即导致列的增加或减少
  • inplace=True,直接在原始 DataFrame 上编辑
  • 有关axis的用法可以参考[[#axis 的理解]]

2.3. 删除行

df.drop([<span class="hljs-number">0</span>,&#xA0;<span class="hljs-number">1</span>])<br>df.drop(index=[<span class="hljs-number">0</span>,&#xA0;<span class="hljs-number">1</span>])

注意第一个参数为index,所以在以条件删除行的时候要确认获得条件筛选之后的index值作为参数。

<span class="hljs-keyword">import</span>&#xA0;pandas&#xA0;<span class="hljs-keyword">as</span>&#xA0;pd<br><span class="hljs-keyword">import</span>&#xA0;numpy&#xA0;<span class="hljs-keyword">as</span>&#xA0;np<br>df&#xA0;=&#xA0;pd.DataFrame(np.arange(<span class="hljs-number">12</span>).reshape(<span class="hljs-number">3</span>,<span class="hljs-number">4</span>),&#xA0;columns=[<span class="hljs-string">'A'</span>,&#xA0;<span class="hljs-string">'B'</span>,&#xA0;<span class="hljs-string">'C'</span>,&#xA0;<span class="hljs-string">'D'</span>])<br><br>df.drop(df[df[<span class="hljs-string">'A'</span>]==<span class="hljs-number">4</span>].index,inplace=<span class="hljs-literal">True</span>)

2.4. 增加列或修改列

data.loc[data[<span class="hljs-string">'id'</span>]&#xA0;>&#xA0;<span class="hljs-number">800</span>,&#xA0;<span class="hljs-string">"first_name"</span>]&#xA0;=&#xA0;<span class="hljs-string">"John"</span>

另外, np.select也可以用来修改已经存在的某列的指定行的值,这种情况下, np.select修改的是整列的值,所以如果只想修改特定条件行的值,要注意修改 default的值。

con&#xA0;=&#xA0;[abb_pop[<span class="hljs-string">'state/region'</span>]&#xA0;==&#xA0;<span class="hljs-string">'PR'</span>,&#xA0;abb_pop[<span class="hljs-string">'state/region'</span>]&#xA0;==&#xA0;<span class="hljs-string">'USA'</span>]<br>values&#xA0;=&#xA0;[<span class="hljs-string">'Puerto&#xA0;Rico'</span>,&#xA0;<span class="hljs-string">'United&#xA0;States&#xA0;of&#xA0;America'</span>]<br><br>abb_pop[<span class="hljs-string">'state'</span>]&#xA0;=&#xA0;np.select(con,&#xA0;values,&#xA0;default=abb_pop[<span class="hljs-string">'state'</span>])

有关 np.wherenp.select的解释可以参考[[#np where 和 np select 再解释]]

对于数值列,以亿为单位。如果数值较小(小于0.1亿),则转化成以万为单位,并加上万”万元”,否则,加上”亿元”。

如何使用np.select()直接操作?

目前,只能想到一种非直接的方法:

[En]

For the time being, only one non-direct method can be thought of:

x&#xA0;=&#xA0;np.array([<span class="hljs-number">0.0001</span>,<span class="hljs-number">0.03</span>,<span class="hljs-number">0.1</span>,<span class="hljs-number">0.9</span>,<span class="hljs-number">1</span>,<span class="hljs-number">4.3</span>])<br>df&#xA0;=&#xA0;pd.DataFrame(x,&#xA0;columns&#xA0;=&#xA0;[<span class="hljs-string">'r_amt'</span>])<br>condlist&#xA0;=&#xA0;[df[<span class="hljs-string">'r_amt'</span>]<=<span class="hljs-number">0.1,&#xA0;df[<span class="hljs-string">'r_amt'</span>]><span class="hljs-number">0.1</span>]<br>choicelist&#xA0;=&#xA0;[df[<span class="hljs-string">'r_amt'</span>]*<span class="hljs-number">10000</span>,&#xA0;df[<span class="hljs-string">'r_amt'</span>]]<br>choicelist2&#xA0;=&#xA0;[<span class="hljs-string">'&#x4E07;&#x5143;'</span>,&#xA0;<span class="hljs-string">'&#x4EBF;&#x5143;'</span>]<br><br><br><br><br>df[<span class="hljs-string">'amt'</span>]&#xA0;=&#xA0;np.select(condlist,&#xA0;choicelist,&#xA0;<span class="hljs-literal">None</span>)<br>df[<span class="hljs-string">'unit'</span>]&#xA0;=&#xA0;np.select(condlist,&#xA0;choicelist2,&#xA0;<span class="hljs-literal">None</span>)<br>df[<span class="hljs-string">'amt'</span>]&#xA0;=&#xA0;df[<span class="hljs-string">'amt'</span>].astype(<span class="hljs-string">'str'</span>)<br>df[<span class="hljs-string">'all'</span>]&#xA0;=&#xA0;df[<span class="hljs-string">'amt'</span>]&#xA0;+&#xA0;df[<span class="hljs-string">'unit'</span>]<br>df<br></=<span>

知识点:

  • apply的重要用法,可以将字符串分割之后的多列组合成pandas,方法就是 apply(Series, 1)
  • stack 将拆散成的多列打散,变成多行。
  • 合并具有相同index的 DataFrameSeries ,可以用 join 。 具体可参见 IMDB – Analysis by Genres
s&#xA0;=&#xA0;dt[<span class="hljs-string">'genres'</span>].str.split(<span class="hljs-string">'|'</span>).apply(Series,&#xA0;<span class="hljs-number">1</span>).stack()<br>s.index&#xA0;=&#xA0;s.index.droplevel(<span class="hljs-number">-1</span>)<br>s.name&#xA0;=&#xA0;<span class="hljs-string">'genres'</span><br><span class="hljs-keyword">del</span>&#xA0;dt[<span class="hljs-string">'genres'</span>]<br>df&#xA0;=&#xA0;dt.join(s)

2.5. 重命名列

两种方式重命名列:

  • 通过使用字典将旧名称映射到新名称进行重命名,格式为 {“old_column_name”: “new_column_name”, …};
  • data.rename(columns={"Area":"place_name"},inplace = False)
  • 通过提供更改列名称的函数重命名。函数应用于每个列名称。
  • data.rename(columns=str.lower)

2.6. 设置索引

df.set_index(<span class="hljs-string">'country'</span>)

设置索引后可以方便地使用loc进行定位,也可以用join连接。

2.7. 设置列名

df.columns=[<span class="hljs-string">'population'</span>,<span class="hljs-string">'total&#xA0;GDP'</span>]

2.8. 对列进行数学操作

df[<span class="hljs-string">'population'</span>]&#xA0;=df[<span class="hljs-string">'population'</span>]*<span class="hljs-number">1000</span>

2.9. 统计列中不同元素出现的次数

df[<span class="hljs-string">'xxx'</span>].value_counts()

2.10. 自定义排序

<span class="hljs-keyword">from</span>&#xA0;pandas.api.types&#xA0;<span class="hljs-keyword">import</span>&#xA0;CategoricalDtype<br>cat_size_order&#xA0;=&#xA0;CategoricalDtype(<br>&#xA0;&#xA0;&#xA0;&#xA0;[<span class="hljs-string">'&#x6D66;&#x4E1C;&#x65B0;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x95F5;&#x884C;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x5F90;&#x6C47;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x677E;&#x6C5F;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x9EC4;&#x6D66;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x666E;&#x9640;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x5609;&#x5B9A;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x9759;&#x5B89;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x5949;&#x8D24;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x6768;&#x6D66;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x9752;&#x6D66;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x5D07;&#x660E;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x8679;&#x53E3;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x91D1;&#x5C71;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x5B9D;&#x5C71;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x957F;&#x5B81;&#x533A;'</span>,&#xA0;<span class="hljs-string">'&#x5168;&#x5E02;'</span>],&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;ordered=<span class="hljs-literal">True</span><br>)<br>df[<span class="hljs-string">'&#x884C;&#x653F;&#x533A;'</span>]&#xA0;=&#xA0;df[<span class="hljs-string">'&#x884C;&#x653F;&#x533A;'</span>].astype(cat_size_order)

2.11. 后续学习stack和unstack

TO BE STUDIED…

参考链接:

https://www.cxyzjd.com/article/S_o_l_o_n/80917211

https://www.jianshu.com/p/8a859643f37e

https://blog.csdn.net/S_o_l_o_n/article/details/80917211

2.12. 数据分段处理

bins&#xA0;=&#xA0;[<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">10</span>,<span class="hljs-number">100</span>,<span class="hljs-number">1000</span>,<span class="hljs-number">10000</span>,<span class="hljs-number">100000</span>,<span class="hljs-number">1000000</span>,<span class="hljs-number">10000000</span>]<br>labels&#xA0;=&#xA0;pd.cut(contb_vs[<span class="hljs-string">'contb_receipt_amt'</span>],bins)<br>contb_vs[<span class="hljs-string">'label'</span>]&#xA0;=&#xA0;labels<br>contb_vs

3.1. axis的理解

我的理解: axis = 0 可以理解为结果影响行, axis = 1 可以理解为结果影响列。也就是说,最终作用的结果是行减少了(增加了)还是列减少了(增加了)。

比如:

data.drop(“Area”,axis=1),列减少;

df.mean(axis=0),行减少;

df.apply(lambda x:x.max()-x.min()),默认 axis = 0,行增加(或减少);

3.2. np.wherenp.select再解释

df[<span class="hljs-string">'hasimage'</span>]&#xA0;=&#xA0;np.where(df[<span class="hljs-string">'photos'</span>]!=&#xA0;<span class="hljs-string">'[]'</span>,&#xA0;<span class="hljs-literal">True</span>,&#xA0;<span class="hljs-literal">False</span>)
store_patterns&#xA0;=&#xA0;[<br>&#xA0;&#xA0;&#xA0;&#xA0;(df[<span class="hljs-string">'Store&#xA0;Name'</span>].str.contains(<span class="hljs-string">'Hy-Vee'</span>,&#xA0;case=<span class="hljs-literal">False</span>,&#xA0;regex=<span class="hljs-literal">False</span>),&#xA0;<span class="hljs-string">'Hy-Vee'</span>),<br>&#xA0;&#xA0;&#xA0;&#xA0;(df[<span class="hljs-string">'Store&#xA0;Name'</span>].str.contains(<span class="hljs-string">'Central&#xA0;City'</span>,<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;case=<span class="hljs-literal">False</span>,&#xA0;&#xA0;regex=<span class="hljs-literal">False</span>),&#xA0;<span class="hljs-string">'Central&#xA0;City'</span>),<br>&#xA0;&#xA0;&#xA0;&#xA0;(df[<span class="hljs-string">'Store&#xA0;Name'</span>].str.contains(<span class="hljs-string">"Smokin'&#xA0;Joe's"</span>,<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;case=<span class="hljs-literal">False</span>,&#xA0;&#xA0;regex=<span class="hljs-literal">False</span>),&#xA0;<span class="hljs-string">"Smokin'&#xA0;Joe's"</span>),<br>&#xA0;&#xA0;&#xA0;&#xA0;(df[<span class="hljs-string">'Store&#xA0;Name'</span>].str.contains(<span class="hljs-string">'Walmart|Wal-Mart'</span>,<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;case=<span class="hljs-literal">False</span>),&#xA0;<span class="hljs-string">'Wal-Mart'</span>)<br>]<br><br>store_criteria,&#xA0;store_values&#xA0;=&#xA0;zip(*store_patterns)<br>df[<span class="hljs-string">'Store_Group_1'</span>]&#xA0;=&#xA0;np.select(store_criteria,&#xA0;store_values,&#xA0;<span class="hljs-string">'other'</span>)

3.3. 时间日期学习

TO BE STUDIED…

参考[[消费行为分析#获取月份]] astype('datetime64[M]')可以将 datetime格式的数据转成月份,优点是datetime64格式,但是在显示的时候会显示成”1970-01-01″这样的格式。

to_period('M')可以将 datetime格式的数据转成月份,而且可以显示成”1970-01″这样的格式。缺点是不是datetime64格式。

如果您只想获得一个单独的月或年,您可以这样做:

[En]

If you only want to get a separate month or year, you can do this:

df[<span class="hljs-string">'year'</span>]&#xA0;=&#xA0;df.order_dt.dt.year<br>df[<span class="hljs-string">'month'</span>]&#xA0;=&#xA0;df.order_dt.dt.month

格式为 int64

另注意,这里只是要获取月份,暂时并不是要以月份重取样然后求和、技术等操作。如果想做数据重取样,需要对order_dt设置索引。因为resample只能对 DatetimeIndex, TimedeltaIndex or PeriodIndex格式的数据进行。

这里有个 resample的常见问题TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of ‘RangeIndex’

Convert column date to datetimes and add parameter on to resample:

df[<span class="hljs-string">'date'</span>]&#xA0;=&#xA0;pd.to_datetime(df[<span class="hljs-string">'date'</span>])<br>weekly_summary&#xA0;=&#xA0;df.story_point.resample(<span class="hljs-string">'W'</span>,&#xA0;on=<span class="hljs-string">'date'</span>).sum()

If need new column:

weekly_summary[<span class="hljs-string">'weekly'</span>]&#xA0;=&#xA0;df.story_point.resample(<span class="hljs-string">'W'</span>,&#xA0;on=<span class="hljs-string">'date'</span>).transform(<span class="hljs-string">'sum'</span>)

Or create DatetimeIndex:

df[<span class="hljs-string">'date'</span>]&#xA0;=&#xA0;pd.to_datetime(df[<span class="hljs-string">'date'</span>])<br>df&#xA0;=&#xA0;df.set_index(<span class="hljs-string">'date'</span>)<br>weekly_summary&#xA0;=&#xA0;df.story_point.resample(<span class="hljs-string">'W'</span>).sum()

If need new column:

weekly_summary[<span class="hljs-string">'weekly'</span>]&#xA0;=&#xA0;df.story_point.resample(<span class="hljs-string">'W'</span>).transform(<span class="hljs-string">'sum'</span>)

3.4. mapapplyapplymaptransform用法

  • map : 针对 Series
  • apply : – 针对 DataFramed 的轴向做运算,也就是说对行或列做运算,不能对单个元素做运算。运算结果返回去重长度的 Series 。 – 针对 Series 的元素进行运算。
  • applymap : 针对 DataFrame 的元素做运算。
  • transform : 运算结果返回原长度的 Series

  • Series 的方法 计算每一种水果的平均价格

dic&#xA0;=&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-string">'item'</span>:[<span class="hljs-string">'apple'</span>,<span class="hljs-string">'banana'</span>,<span class="hljs-string">'orange'</span>,<span class="hljs-string">'banana'</span>,<span class="hljs-string">'orange'</span>,<span class="hljs-string">'apple'</span>],<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-string">'price'</span>:[<span class="hljs-number">4</span>,<span class="hljs-number">3</span>,<span class="hljs-number">3</span>,<span class="hljs-number">2.5</span>,<span class="hljs-number">4</span>,<span class="hljs-number">2</span>],<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-string">'color'</span>:[<span class="hljs-string">'red'</span>,<span class="hljs-string">'yellow'</span>,<span class="hljs-string">'yellow'</span>,<span class="hljs-string">'green'</span>,<span class="hljs-string">'green'</span>,<span class="hljs-string">'green'</span>],<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-string">'weight'</span>:[<span class="hljs-number">12</span>,<span class="hljs-number">20</span>,<span class="hljs-number">50</span>,<span class="hljs-number">30</span>,<span class="hljs-number">20</span>,<span class="hljs-number">44</span>]<br>}<br><br>df&#xA0;=&#xA0;DataFrame(dic)<br>mean_price&#xA0;=&#xA0;df.groupby(<span class="hljs-string">'item'</span>)[<span class="hljs-string">'price'</span>].mean().to_dict()<br>df[<span class="hljs-string">'mean_price'</span>]&#xA0;=&#xA0;df[<span class="hljs-string">'item'</span>].map(mean_price)
  • DataFramed 的方法, 返回去重长度的 Series
  • 作用:可以将 DataFramed 中的行或列数据进行某种形式的运算操作。
<span class="hljs-function"><span class="hljs-keyword">def</span>&#xA0;<span class="hljs-title">func</span><span class="hljs-params">(s)</span>:</span><br>&#xA0;&#xA0;&#xA0;&#xA0;s&#xA0;=&#xA0;s.sum()<br>&#xA0;&#xA0;&#xA0;&#xA0;print(s)<br>df.apply(func)
  • 返回原长度的 Series
  • 如果要用自定义函数增加新列或对原有列赋值,要用 transform
<span class="hljs-function"><span class="hljs-keyword">def</span>&#xA0;<span class="hljs-title">my_mean</span><span class="hljs-params">(s)</span>:</span><br>&#xA0;&#xA0;&#xA0;&#xA0;sum&#xA0;=&#xA0;<span class="hljs-number">0</span><br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">for</span>&#xA0;i&#xA0;<span class="hljs-keyword">in</span>&#xA0;s:<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;sum&#xA0;+=&#xA0;i<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">return</span>&#xA0;sum&#xA0;/&#xA0;s.size<br>df.groupby(<span class="hljs-string">'item'</span>)[<span class="hljs-string">'price'</span>].apply(my_mean)<br><br><br><br><br><br><br>df.groupby(<span class="hljs-string">'item'</span>)[<span class="hljs-string">'price'</span>].transform(my_mean)<br><br><br><br><br><br><br><br>

是否可以计算出每种水果的平均价格,即: 卖 出 的 总 价 除 以 卖 出 的 重 量 ? 下面的方法是生成一个新的dataframe,是否有方法可以直接在原dataframe上直接出结果?

df[<span class="hljs-string">'gross'</span>]&#xA0;=&#xA0;df[<span class="hljs-string">'price'</span>]&#xA0;*&#xA0;df[<span class="hljs-string">'weight'</span>]<br>df2&#xA0;=&#xA0;df.groupby(<span class="hljs-string">'item'</span>).agg({<span class="hljs-string">'gross'</span>:sum,<span class="hljs-string">'weight'</span>:sum})<br>df2[<span class="hljs-string">'total_mean_price'</span>]&#xA0;=&#xA0;round(df2[<span class="hljs-string">'gross'</span>]/df2[<span class="hljs-string">'weight'</span>],<span class="hljs-number">2</span>)<br>df2

3.5. 映射索引

修改索引、列名。

df4&#xA0;=&#xA0;DataFrame({<span class="hljs-string">'color'</span>:[<span class="hljs-string">'white'</span>,<span class="hljs-string">'gray'</span>,<span class="hljs-string">'purple'</span>,<span class="hljs-string">'blue'</span>,<span class="hljs-string">'green'</span>],&#xA0;<span class="hljs-string">'value'</span>:np.random.randint(<span class="hljs-number">10</span>,size=<span class="hljs-number">5</span>)})<br>new_index&#xA0;=&#xA0;{<span class="hljs-number">0</span>:<span class="hljs-string">'first'</span>,<span class="hljs-number">1</span>:<span class="hljs-string">'two'</span>,<span class="hljs-number">2</span>:<span class="hljs-string">'three'</span>,<span class="hljs-number">3</span>:<span class="hljs-string">'four'</span>,<span class="hljs-number">4</span>:<span class="hljs-string">'five'</span>}<br>new_col&#xA0;=&#xA0;{<span class="hljs-string">'color'</span>:<span class="hljs-string">'cc'</span>,<span class="hljs-string">'value'</span>:<span class="hljs-string">'vv'</span>}<br>df4.rename(index&#xA0;=&#xA0;new_index,&#xA0;columns&#xA0;=&#xA0;new_col)

pd.concat(objs, axis=0, join=’outer’, join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)

  • objs:Series,DataFrame或Panel对象的序列或映射。如果传递了dict,则排序的键将用作keys参数,除非它被传递,在这种情况下将选择值(见下文)。任何None对象都将以静默方式删除,除非它们都是None,在这种情况下将引发ValueError。
  • axis :{0,1,…},默认为0.要连接的轴。
  • join:{‘inner’,’outer’},默认为’outer’。如何处理其他轴上的索引。结合的外部和交叉的内部。
  • ignore_index:boolean,默认为False。如果为True,请不要在连接轴上使用索引值。生成的轴将标记为0,…,n – 1.如果要连接并置轴没有有意义的索引信息的对象,这将非常有用。请注意,在连接中仍然遵循其他轴上的索引值。
  • join_axes:索引对象列表。用于其他n – 1轴的特定索引,而不是执行内部/外部设置逻辑。
  • keys:序列,默认无。使用传递的键作为最外层来构造层次索引。如果传递了多个级别,则应包含元组。
  • levels:序列列表,默认无。用于构造MultiIndex的特定级别(唯一值)。否则,他们将从键中推断出来。
  • names:list,默认无。生成的分层索引中的级别的名称。
  • verify_integrity:boolean,默认为False。检查新的连锁轴是否包含重复项。相对于实际数据连接,这可能非常昂贵。
  • copy:boolean,默认为True。如果为False,则不要不必要地复制数据。
<br>result&#xA0;=&#xA0;pd.merge(user_usage,<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;user_device[[<span class="hljs-string">'use_id'</span>,&#xA0;<span class="hljs-string">'platform'</span>,&#xA0;<span class="hljs-string">'device'</span>]],<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;on=<span class="hljs-string">'use_id'</span>,<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;how=<span class="hljs-string">'left'</span>)<br><br><br><br>devices.rename(columns={<span class="hljs-string">"Retail&#xA0;Branding"</span>:&#xA0;<span class="hljs-string">"manufacturer"</span>},&#xA0;inplace=<span class="hljs-literal">True</span>)<br>result&#xA0;=&#xA0;pd.merge(result,&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;devices[[<span class="hljs-string">'manufacturer'</span>,&#xA0;<span class="hljs-string">'Model'</span>]],<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;left_on=<span class="hljs-string">'device'</span>,<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;right_on=<span class="hljs-string">'Model'</span>,<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;how=<span class="hljs-string">'left'</span>)

merge、join也可以用来合并,比较简单。

5.1. pandas内置计算函数

print(data[<span class="hljs-string">'item'</span>].count())<br>print(data[<span class="hljs-string">'duration'</span>].max())<br>print(data[<span class="hljs-string">'duration'</span>][data[<span class="hljs-string">'item'</span>]==<span class="hljs-string">'call'</span>].sum())<br>print(data[<span class="hljs-string">'month'</span>].value_counts())<br>print(data[<span class="hljs-string">'network'</span>].nunique())

另有 uniquenunique等函数。

5.2. numpy中的函数

np.ptp(arr,axis=<span class="hljs-number">0</span>)

如果不用ptp,下面的写法就比较复杂了:

df_arr&#xA0;=&#xA0;pd.DataFrame(arr)<br>df_arr.loc[:,[<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>]].max()&#xA0;-df_arr.loc[:,[<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>]].min()

5.3. 聚合

data.groupby(<span class="hljs-string">'month'</span>)[<span class="hljs-string">'duration'</span>].sum()<br><br>data[data[<span class="hljs-string">'item'</span>]==<span class="hljs-string">'call'</span>].groupby(<span class="hljs-string">'network'</span>)[<span class="hljs-string">'duration'</span>].sum().sort_values(ascending=<span class="hljs-literal">False</span>)<br><br>data.groupby([<span class="hljs-string">'month'</span>,<span class="hljs-string">'item'</span>])[<span class="hljs-string">'date'</span>].count()<br><br>data.groupby(<span class="hljs-string">'month'</span>,as_index=<span class="hljs-literal">False</span>).agg({<span class="hljs-string">'duration'</span>:[<span class="hljs-string">'sum'</span>,<span class="hljs-string">'count'</span>,&#xA0;<span class="hljs-string">'max'</span>,<span class="hljs-string">'min'</span>,<span class="hljs-string">'mean'</span>]})
data.groupby(<span class="hljs-string">'month'</span>)[<span class="hljs-string">'duration'</span>].sum()&#xA0;<br><br>data.groupby(<span class="hljs-string">'month'</span>)[[<span class="hljs-string">'duration'</span>]].sum()&#xA0;

聚合字典语法非常灵活,可以在操作之前定义。还可以使用 lambda 函数内联定义函数,以提取内置选项未提供的统计信息。

<span class="hljs-keyword">from</span>&#xA0;datetime&#xA0;<span class="hljs-keyword">import</span>&#xA0;timedelta<br>aggregations&#xA0;=&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-string">'duration'</span>:<span class="hljs-string">'sum'</span>,<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-string">'date'</span>:&#xA0;[<span class="hljs-keyword">lambda</span>&#xA0;x:&#xA0;max(x).date(),&#xA0;<span class="hljs-keyword">lambda</span>&#xA0;x:&#xA0;(max(x)&#xA0;-&#xA0;timedelta(days=<span class="hljs-number">1</span>)).date()]<br>}<br>grp&#xA0;=&#xA0;data.groupby(<span class="hljs-string">'month'</span>,as_index=<span class="hljs-literal">False</span>).agg(aggregations)<br>grp.columns&#xA0;=&#xA0;grp.columns.droplevel(level=<span class="hljs-number">0</span>)<br>grp.rename(columns={<span class="hljs-string">'sum'</span>:<span class="hljs-string">'duration_sum'</span>,&#xA0;<span class="hljs-string">r'<lambda_0>'</lambda_0></span>:<span class="hljs-string">'date'</span>,&#xA0;<span class="hljs-string">r'<lambda_1>'</lambda_1></span>:<span class="hljs-string">'date-1'</span>})

知识点 筛选行不仅可以用loc,还可以用query:

df.query(<span class="hljs-string">'Product==["CPU","Software"]'</span>)

6.1. 设置数据类型为类别

设置数据类型为类别的好处:比如查询单元格中是否有某个字符串,如果是str(object)类型,则需要对每一个单元格进行运算;如果是category类型,则不需要每个单元格运算,只需要对仅有的几个类型进行运算即可。对于较大数据,会明显提升速度。

df[<span class="hljs-string">"Status"</span>]&#xA0;=&#xA0;df[<span class="hljs-string">"Status"</span>].astype(<span class="hljs-string">"category"</span>)<br><br>df[<span class="hljs-string">'Status'</span>].cat.set_categories([<span class="hljs-string">"won"</span>,<span class="hljs-string">"pending"</span>,<span class="hljs-string">"presented"</span>,<span class="hljs-string">"declined"</span>],inplace=<span class="hljs-literal">True</span>)

6.2. 一般用法

table&#xA0;=&#xA0;pd.pivot_table(df,index=[<span class="hljs-string">"Manager"</span>,<span class="hljs-string">"Status"</span>],columns=[<span class="hljs-string">"Product"</span>],values=[<span class="hljs-string">"Quantity"</span>,<span class="hljs-string">"Price"</span>],<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;aggfunc={<span class="hljs-string">"Quantity"</span>:len,<span class="hljs-string">"Price"</span>:[np.sum,np.mean]},fill_value=<span class="hljs-number">0</span>)

6.3. 设置双index

pd.pivot_table(df,index=[<span class="hljs-string">"Name"</span>,<span class="hljs-string">"Account"</span>])

pivot_table 的一个令人困惑的问题是使用列和值。请记住,列 是 可 选 的 它 们 提 供 了 一 种 额 外 的 方 法 来 细 分 你 关 心 的 实 际 值 。 聚 合 函 数 将 应 用 于 你 列 出 的 值 。

6.4. 有无columns参数的区别

pd.pivot_table(df,index=[<span class="hljs-string">'Manager'</span>,<span class="hljs-string">'Rep'</span>],values=[<span class="hljs-string">'Price'</span>],aggfunc=[<span class="hljs-string">'sum'</span>],fill_value=<span class="hljs-number">0</span>)<br><br>pd.pivot_table(df,index=[<span class="hljs-string">'Manager'</span>,<span class="hljs-string">'Rep'</span>],values=[<span class="hljs-string">'Price'</span>],columns=[<span class="hljs-string">'Product'</span>],aggfunc=[np.sum],fill_value=<span class="hljs-number">0</span>)

6.5. 将项目移动到索引获得不同的可视化效果:

pd.pivot_table(df,index=[<span class="hljs-string">'Manager'</span>,<span class="hljs-string">'Rep'</span>,<span class="hljs-string">'Product'</span>],values=[<span class="hljs-string">'Price'</span>,<span class="hljs-string">'Quantity'</span>],aggfunc=[np.sum],fill_value=<span class="hljs-number">0</span>)

6.6. margins=True可以实现看总数的需求。

pd.pivot_table(df,index=[<span class="hljs-string">'Manager'</span>,<span class="hljs-string">'Rep'</span>,<span class="hljs-string">'Product'</span>],values=[<span class="hljs-string">'Price'</span>,<span class="hljs-string">'Quantity'</span>],aggfunc=[np.sum,np.mean],fill_value=<span class="hljs-number">0</span>,margins=<span class="hljs-literal">True</span>)

6.7. set_categories的作用

Status就根据之前定义的顺序排列

pd.pivot_table(df,index=[<span class="hljs-string">'Manager'</span>,<span class="hljs-string">'Status'</span>],values=[<span class="hljs-string">'Price'</span>],aggfunc=[np.sum],fill_value=<span class="hljs-number">0</span>,margins=<span class="hljs-literal">True</span>)

6.8. unstack()和stack()可以让groupby(部分?)实现pivot_table的功能

<br>pd.pivot_table(contb,index=[<span class="hljs-string">'contbr_occupation'</span>],columns=[<span class="hljs-string">'party'</span>],aggfunc=<span class="hljs-string">'sum'</span>,values=[<span class="hljs-string">'contb_receipt_amt'</span>])<br><br>contb.groupby([<span class="hljs-string">'contbr_occupation'</span>,<span class="hljs-string">'party'</span>])[<span class="hljs-string">'contb_receipt_amt'</span>].sum().unstack()

6.9. 一张图总结

读取文件比较简单,但是读取 csv文件的有个小技巧:有些 csv文件的分隔符为一个或多个空格、一个或多个制表符,此时 sep参数要设置为 sep='\s+'

columns&#xA0;=&#xA0;[<span class="hljs-string">'user_id'</span>,<span class="hljs-string">'order_dt'</span>,&#xA0;<span class="hljs-string">'order_products'</span>,&#xA0;<span class="hljs-string">'order_amount'</span>]<br>df&#xA0;=&#xA0;pd.read_csv(<span class="hljs-string">'CDNOW_master.txt'</span>,&#xA0;names=columns,&#xA0;sep=<span class="hljs-string">'\s+'</span>)
  • *pd.to_excel()对于dataframe数据的写入很方便,缺点是如果工作簿已经存在则会重置工作簿,即原工作簿的内容都会擦掉,而且不能(?)调格式。
&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">with</span>&#xA0;pd.ExcelWriter(xlsname)&#xA0;<span class="hljs-keyword">as</span>&#xA0;writer:<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;df1.to_excel(writer,&#xA0;sheet_name=<span class="hljs-string">'XXX'</span>,index=<span class="hljs-literal">False</span>)<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;df2.to_excel(writer,&#xA0;sheet_name=<span class="hljs-string">'YYY'</span>,index=<span class="hljs-literal">False</span>)
  • openpyxl。
  • 把dataframe数据用openpyxl写入excel优点是可以定向写入,不影响原内容(不设定其他参数的情况下,也不修改原单元格的格式,如字体字号加粗等),适合在已设定好格式的模板上指定位置填充数据。
&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">import</span>&#xA0;openpyxl&#xA0;<span class="hljs-keyword">as</span>&#xA0;op<br>&#xA0;&#xA0;&#xA0;&#xA0;ontent_1&#xA0;=&#xA0;<span class="hljs-string">'&#x4E0A;&#x6D77;'</span>&#xA0;+&#xA0;str(int(month))&#xA0;+&#xA0;<span class="hljs-string">'&#x6708;'</span>&#xA0;+&#xA0;str(int(day))&#xA0;+&#xA0;<span class="hljs-string">'&#x65E5;&#x65E5;&#x62A5;&#x672A;&#x76F4;&#x62A5;&#x673A;&#x6784;&#x6C47;&#x603B;&#x6570;&#xFF08;'</span>&#xA0;+&#xA0;str(not_direct_report)&#xA0;+&#xA0;<span class="hljs-string">'&#x5BB6;&#x672A;&#x76F4;&#x62A5;&#xFF0C;&#x53E6;&#x6709;8280&#x5317;&#x5FB7;&#x610F;&#x5FD7;&#x94F6;&#x884C;&#x65E5;&#x62A5;&#x65E0;&#x6570;&#x636E;&#xFF09;'</span><br>&#xA0;&#xA0;&#xA0;&#xA0;file&#xA0;=&#xA0;<span class="hljs-string">'filename'</span><br>&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;wb&#xA0;=&#xA0;op.load_workbook(file)<br>&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;sh=wb[<span class="hljs-string">"AAA"</span>]<br>&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;sh.cell(<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,content_1)
  • 缺点是对于dataframe数据的操作不友好,需要用循环,暂时还没学到别的高效的方法。
&#xA0;&#xA0;&#xA0;&#xA0;sh=wb[<span class="hljs-string">"BBB"</span>]<br>&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;headlines&#xA0;=&#xA0;{<span class="hljs-number">1</span>:<span class="hljs-string">'aa'</span>,&#xA0;<span class="hljs-number">2</span>:<span class="hljs-string">'bb'</span>,&#xA0;<span class="hljs-number">3</span>:<span class="hljs-string">'cc'</span>,&#xA0;<span class="hljs-number">4</span>:<span class="hljs-string">'dd'</span>,&#xA0;<span class="hljs-number">5</span>:str(int(month))&#xA0;+&#xA0;<span class="hljs-string">'&#x6708;'</span>&#xA0;+&#xA0;str(int(day))&#xA0;+&#xA0;<span class="hljs-string">'&#x65E5;&#x4F59;&#x989D;'</span>,&#xA0;<span class="hljs-number">6</span>:<span class="hljs-string">'ee'</span>}<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">for</span>&#xA0;col,headline&#xA0;<span class="hljs-keyword">in</span>&#xA0;headlines.items():<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;sh.cell(<span class="hljs-number">1</span>,col,headline)<br>&#xA0;&#xA0;&#xA0;&#xA0;sh.row_dimensions[<span class="hljs-number">1</span>].height&#xA0;=&#xA0;<span class="hljs-number">43.2</span><br>&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">for</span>&#xA0;col&#xA0;<span class="hljs-keyword">in</span>&#xA0;mx_not_direct_repo.columns:<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;a&#xA0;=&#xA0;mx_not_direct_repo[col].tolist()<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">for</span>&#xA0;i&#xA0;<span class="hljs-keyword">in</span>&#xA0;range(len(a)):<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;sh.cell(i+<span class="hljs-number">2</span>,j,a[i])<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;j&#xA0;+=&#xA0;<span class="hljs-number">1</span>

9.1. 删除空值所在的行

  • isna只能判断某个元素是否为NaN
df.isna()
  • anyall 方法

any 方法的 axis 参数为 1 ,表名对每一行的多列来说,最终形成一个字段 TrueFalse ,效果就是列减少。参见 [[#axis 的理解]] 。

  • 直接使用pandas封装好的 dropna
df.dropna(inplace=<span class="hljs-literal">True</span>)

9.2. 空值填充

  • ffill 向前填充
  • bfill 向后填充
df.fillna(method=<span class="hljs-string">'ffill'</span>,axis=<span class="hljs-number">0</span>)

9.3. 删除重复行

df.loc[<span class="hljs-number">1</span>]&#xA0;=&#xA0;[<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>]<br>df.loc[<span class="hljs-number">3</span>]&#xA0;=&#xA0;[<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>]<br>df.loc[<span class="hljs-number">5</span>]&#xA0;=&#xA0;[<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>]<br>df.loc[<span class="hljs-number">7</span>]&#xA0;=&#xA0;[<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>]<br>df.drop_duplicates(keep=<span class="hljs-string">'first'</span>,inplace=<span class="hljs-literal">True</span>)

9.4. 删除异常值所在的行

df&#xA0;=&#xA0;pd.DataFrame(np.random.random(size=(<span class="hljs-number">1000</span>,<span class="hljs-number">3</span>)),columns=[<span class="hljs-string">'A'</span>,<span class="hljs-string">'B'</span>,<span class="hljs-string">'C'</span>])<br><br>df.drop(df.loc[~(df[<span class="hljs-string">'C'</span>]&#xA0;>&#xA0;(<span class="hljs-number">2</span>&#xA0;*df[<span class="hljs-string">'C'</span>].std()))].index,inplace=<span class="hljs-literal">True</span>,axis=<span class="hljs-number">0</span>)

9.5. 替换

<span class="hljs-keyword">import</span>&#xA0;pandas&#xA0;<span class="hljs-keyword">as</span>&#xA0;pd<br><span class="hljs-keyword">import</span>&#xA0;numpy&#xA0;<span class="hljs-keyword">as</span>&#xA0;np<br><span class="hljs-keyword">from</span>&#xA0;pandas&#xA0;<span class="hljs-keyword">import</span>&#xA0;DataFrame,Series<br>df&#xA0;=&#xA0;DataFrame(np.random.randint(<span class="hljs-number">0</span>,<span class="hljs-number">100</span>,size=(<span class="hljs-number">8</span>,<span class="hljs-number">7</span>)))<br><br>df.replace(to_replace={<span class="hljs-number">0</span>:<span class="hljs-string">'zero'</span>,<span class="hljs-number">4</span>:<span class="hljs-string">'four'</span>})
<br>df.replace(to_replace={<span class="hljs-number">4</span>:<span class="hljs-number">0</span>},value=<span class="hljs-number">666</span>)
df.columns&#xA0;=&#xA0;[<span class="hljs-string">'zero'</span>,<span class="hljs-string">'one'</span>,<span class="hljs-string">'two'</span>,<span class="hljs-string">'three'</span>,<span class="hljs-string">'four'</span>,<span class="hljs-string">'five'</span>,<span class="hljs-string">'six'</span>]<br><br>df.replace(to_replace={<span class="hljs-string">'four'</span>:<span class="hljs-number">0</span>},value=<span class="hljs-number">777</span>)<br>

可否对指定行替换?

df.loc[<span class="hljs-number">3</span>][df.loc[<span class="hljs-number">3</span>]&#xA0;==&#xA0;<span class="hljs-number">18</span>]&#xA0;=&#xA0;<span class="hljs-number">200</span><br>df<br><span class="hljs-string">"""<br>&#x662F;&#x5426;&#x8FD8;&#x6709;&#x522B;&#x7684;&#x65B9;&#x6CD5;&#xFF1F;<br>"""</span>

mapSeris的一个方法。 map字典可以进行映射操作。

dic_data&#xA0;=&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-string">'name'</span>:[<span class="hljs-string">'&#x5F20;&#x4E09;'</span>,<span class="hljs-string">'&#x674E;&#x56DB;'</span>,<span class="hljs-string">'&#x738B;&#x8001;&#x4E94;'</span>],<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-string">'salary'</span>:[<span class="hljs-number">22222</span>,<span class="hljs-number">7777</span>,<span class="hljs-number">11111</span>]<br>}<br>df&#xA0;=&#xA0;DataFrame(dic_data)<br>dic_map&#xA0;=&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-string">'&#x5F20;&#x4E09;'</span>:<span class="hljs-string">'tom'</span>,<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-string">'&#x674E;&#x56DB;'</span>:<span class="hljs-string">'jay'</span>,<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-string">'&#x738B;&#x8001;&#x4E94;'</span>:<span class="hljs-string">'jerry'</span><br>}<br>df[<span class="hljs-string">'e_name'</span>]&#xA0;=&#xA0;df[<span class="hljs-string">'name'</span>].map(dic_map)<br>df
  • map : 将列里面的所有的数据进行替换;如果不存在相关键值,则赋值NaN
  • replace : 替换其中一部分
  • np.select : 可以替换,需设定好default值。

map 也可以用别的方式来达到替换某些索引行的目的,即 传入函数,而不是字典。这种方法可以替换 np.select

dic_map&#xA0;=&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-string">'&#x5F20;&#x4E09;'</span>:<span class="hljs-string">'tom'</span>,<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-string">'&#x674E;&#x56DB;'</span>:<span class="hljs-string">'jay'</span>,<br>}<br><br>f&#xA0;=&#xA0;<span class="hljs-keyword">lambda</span>&#xA0;x&#xA0;:&#xA0;dic_map.get(x,x)<br>df[<span class="hljs-string">'name'</span>]&#xA0;=&#xA0;df[<span class="hljs-string">'name'</span>].map(f)<br>df

替换行列名,可以用 rename。参考[[#映射索引]]节。

map函数可以做运算工具:

<br>df[<span class="hljs-string">'net_pay'</span>]&#xA0;=&#xA0;df[<span class="hljs-string">'salary'</span>].map(<span class="hljs-keyword">lambda</span>&#xA0;x:&#xA0;(x&#xA0;-&#xA0;<span class="hljs-number">3000</span>)&#xA0;*&#xA0;<span class="hljs-number">0.5</span>&#xA0;+&#xA0;<span class="hljs-number">3000</span>)<br>df

运算工具主要有 mapapplyapplymap ,用法参考[[#map 、 apply 、 applymap 用法]]。

9.6. 随机抽样

  • take
  • permutation
<span class="hljs-string">"""<br>take&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x53EA;&#x80FD;&#x7528;&#x9690;&#x5F0F;&#x7D22;&#x5F15;&#xFF0C;&#x800C;&#x4E0D;&#x80FD;&#x7528;&#x663E;&#x5F0F;&#x7D22;&#x5F15;&#xFF0C;&#x56E0;&#x4E3A;&#x8FD9;&#x4E2A;&#x5217;&#x8868;&#x4E00;&#x822C;&#x662F;&#x8981;&#x81EA;&#x52A8;&#x751F;&#x6210;&#x7684;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x8BA9;&#x7528;&#x6237;&#x81EA;&#x5DF1;&#x5199;&#x5217;&#x540D;&#x7B49;&#x64CD;&#x4F5C;&#x3002;<br>"""</span><br>df&#xA0;=&#xA0;DataFrame(data=np.random.randint(<span class="hljs-number">0</span>,<span class="hljs-number">100</span>,size=(<span class="hljs-number">100</span>,<span class="hljs-number">3</span>)),columns=[<span class="hljs-string">'A'</span>,<span class="hljs-string">'B'</span>,<span class="hljs-string">'C'</span>])<br><br>df.take([<span class="hljs-number">2</span>,<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">4</span>],axis=<span class="hljs-number">0</span>)<br><br><br>df.take(np.random.permutation(<span class="hljs-number">3</span>),axis=<span class="hljs-number">1</span>).take(np.random.permutation(<span class="hljs-number">100</span>),axis=<span class="hljs-number">0</span>)[:<span class="hljs-number">10</span>]

Original: https://blog.csdn.net/FIGO001001/article/details/125434217
Author: FIGO001001
Title: pandas笔记



相关阅读

Title: 文本数据标注平台-doccano安装使用教程

doccano简介

doccano 是一个开源的文本注释工具。它为文本分类、序列标记和序列到序列任务提供注释功能。因此,可以为情感分析、命名实体识别、文本摘要等创建标记数据。只需创建一个项目,上传数据并开始注释。

安装

本文是基于anaconda来进行安装。

首先,在anaconda下创建虚拟环境:

conda create -n doccano python=3.9

注:建议python版本为3.9+

然后,激活doccano环境:

conda activate doccano

在doccano环境下安装doccano:

pip install doccano

运行

在doccano环境下执行:

doccano init

pandas笔记

注意:初始化过程中可能会遇到以下错误:

[En]

Note: the following error may be encountered during initialization:

django.db.utils.OperationalError: error in index django_celery_results_taskresult_hidden_cd77412f after drop column: no such column: hidden

pandas笔记

此时的解决方案为:

pip uninstall Django
pip install Django==4.0.4

即更换Django版本为4.0.4。

初始化成功后,创建用户名和密码:

[En]

After successful initialization, create a user name and password:

doccano createuser --username admin --password pass

然后再开启一个Web服务:

doccano webserver --port 8000

最后,再开启一个cmd命令框,进去doccano环境,运行一下命令:

doccano task

现在,您可以在浏览器中打开下面的链接,并使用您刚刚创建的用户名和密码登录。

[En]

Now you can open the link below in the browser and log in with the user name and password you just created.

http://127.0.0.1:8000/

具体使用方法请参见:如何使用文本标注工具doccano

Original: https://blog.csdn.net/weixin_44384491/article/details/126159152
Author: 一个又帅又正直的人
Title: 文本数据标注平台-doccano安装使用教程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/298589/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总