1.1. 创建Series
- 从字典创建
prices = {<span class="hljs-string">'apple'</span>:<span class="hljs-number">4.99</span>,<br>  <span class="hljs-string">'banana'</span>:<span class="hljs-number">1.99</span>,<br>  <span class="hljs-string">'orange'</span>:<span class="hljs-number">3.99</span>,<br>  <span class="hljs-string">'grapes'</span>:<span class="hljs-number">0.99</span>}<br>ser = pd.Series(prices)
- 从标量创建
ser = pd.Series(<span class="hljs-number">2</span>,index = range(<span class="hljs-number">0</span>,<span class="hljs-number">5</span>))
ser = pd.Series(range(<span class="hljs-number">1</span>,<span class="hljs-number">15</span>,<span class="hljs-number">3</span>),index=[x <span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> <span class="hljs-string">'abcde'</span>])
<span class="hljs-keyword">import</span> random<br>ser = pd.Series(random.sample(range(<span class="hljs-number">100</span>),<span class="hljs-number">6</span>))
<span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd<br>a =[<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 = pd.Series(a,name =<span class="hljs-string">'JOE'</span>)<br>a = pd.DataFrame(a)
1.2. 提取元素
<span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd<br><span class="hljs-keyword">import</span> random<br><br>x = random.sample(range(<span class="hljs-number">100</span>),<span class="hljs-number">10</span>)<br>print(x)<br>y = 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 = 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> <span class="hljs-title">joe</span><span class="hljs-params">(x)</span>:</span><br>    <span class="hljs-keyword">return</span> x +<span class="hljs-number">10</span><br>x = random.sample(range(<span class="hljs-number">100</span>),<span class="hljs-number">10</span>)<br>print(<span class="hljs-string">'Data => '</span>,x,<span class="hljs-string">'\n'</span>)<br>y = pd.Series(x)<br>print(<span class="hljs-string">'Applying pow => \n'</span> ,pow(y,<span class="hljs-number">2</span>),<span class="hljs-string">'\n'</span>)<br>print(<span class="hljs-string">'Applying joe => \n'</span>,joe(y))
x = pd.Series(range(<span class="hljs-number">1</span>,<span class="hljs-number">8</span>),index=[x <span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> <span class="hljs-string">'abcdefg'</span>])<br>print(x,<span class="hljs-string">'\n'</span>)<br>print(<span class="hljs-string">'Is "j" in x? '</span>,<span class="hljs-string">'j'</span> <span class="hljs-keyword">in</span> x)<br>print(<span class="hljs-string">'Is "d" in x? '</span>, <span class="hljs-string">'d'</span> <span class="hljs-keyword">in</span> 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 = pd.DataFrame()<br>s = 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> i <span class="hljs-keyword">in</span> range(s.size):<br>    ex = <span class="hljs-string">'cand_nm == "%s" & contb_receipt_amt == %f'</span> % (s.index[i], s.values[i])<br>    <br>    df_max_donation = 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>, <span class="hljs-number">1</span>])<br>df.drop(index=[<span class="hljs-number">0</span>, <span class="hljs-number">1</span>])
注意第一个参数为index,所以在以条件删除行的时候要确认获得条件筛选之后的index值作为参数。
<span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd<br><span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np<br>df = pd.DataFrame(np.arange(<span class="hljs-number">12</span>).reshape(<span class="hljs-number">3</span>,<span class="hljs-number">4</span>), columns=[<span class="hljs-string">'A'</span>, <span class="hljs-string">'B'</span>, <span class="hljs-string">'C'</span>, <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>] > <span class="hljs-number">800</span>, <span class="hljs-string">"first_name"</span>] = <span class="hljs-string">"John"</span>
另外, np.select
也可以用来修改已经存在的某列的指定行的值,这种情况下, np.select
修改的是整列的值,所以如果只想修改特定条件行的值,要注意修改 default
的值。
con = [abb_pop[<span class="hljs-string">'state/region'</span>] == <span class="hljs-string">'PR'</span>, abb_pop[<span class="hljs-string">'state/region'</span>] == <span class="hljs-string">'USA'</span>]<br>values = [<span class="hljs-string">'Puerto Rico'</span>, <span class="hljs-string">'United States of America'</span>]<br><br>abb_pop[<span class="hljs-string">'state'</span>] = np.select(con, values, default=abb_pop[<span class="hljs-string">'state'</span>])
有关 np.where
和 np.select
的解释可以参考[[#np where 和 np select 再解释]]
对于数值列,以亿为单位。如果数值较小(小于0.1亿),则转化成以万为单位,并加上万”万元”,否则,加上”亿元”。
如何使用np.select()直接操作?
目前,只能想到一种非直接的方法:
[En]
For the time being, only one non-direct method can be thought of:
x = 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 = pd.DataFrame(x, columns = [<span class="hljs-string">'r_amt'</span>])<br>condlist = [df[<span class="hljs-string">'r_amt'</span>]<=<span class="hljs-number">0.1, df[<span class="hljs-string">'r_amt'</span>]><span class="hljs-number">0.1</span>]<br>choicelist = [df[<span class="hljs-string">'r_amt'</span>]*<span class="hljs-number">10000</span>, df[<span class="hljs-string">'r_amt'</span>]]<br>choicelist2 = [<span class="hljs-string">'万元'</span>, <span class="hljs-string">'亿元'</span>]<br><br><br><br><br>df[<span class="hljs-string">'amt'</span>] = np.select(condlist, choicelist, <span class="hljs-literal">None</span>)<br>df[<span class="hljs-string">'unit'</span>] = np.select(condlist, choicelist2, <span class="hljs-literal">None</span>)<br>df[<span class="hljs-string">'amt'</span>] = df[<span class="hljs-string">'amt'</span>].astype(<span class="hljs-string">'str'</span>)<br>df[<span class="hljs-string">'all'</span>] = df[<span class="hljs-string">'amt'</span>] + df[<span class="hljs-string">'unit'</span>]<br>df<br></=<span>
知识点:
- apply的重要用法,可以将字符串分割之后的多列组合成pandas,方法就是
apply(Series, 1)
。 stack
将拆散成的多列打散,变成多行。- 合并具有相同index的
DataFrame
和Series
,可以用join
。 具体可参见 IMDB – Analysis by Genres
s = dt[<span class="hljs-string">'genres'</span>].str.split(<span class="hljs-string">'|'</span>).apply(Series, <span class="hljs-number">1</span>).stack()<br>s.index = s.index.droplevel(<span class="hljs-number">-1</span>)<br>s.name = <span class="hljs-string">'genres'</span><br><span class="hljs-keyword">del</span> dt[<span class="hljs-string">'genres'</span>]<br>df = 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 GDP'</span>]
2.8. 对列进行数学操作
df[<span class="hljs-string">'population'</span>] =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> pandas.api.types <span class="hljs-keyword">import</span> CategoricalDtype<br>cat_size_order = CategoricalDtype(<br>    [<span class="hljs-string">'浦东新区'</span>, <span class="hljs-string">'闵行区'</span>, <span class="hljs-string">'徐汇区'</span>, <span class="hljs-string">'松江区'</span>, <span class="hljs-string">'黄浦区'</span>, <span class="hljs-string">'普陀区'</span>, <span class="hljs-string">'嘉定区'</span>, <span class="hljs-string">'静安区'</span>, <span class="hljs-string">'奉贤区'</span>, <span class="hljs-string">'杨浦区'</span>, <span class="hljs-string">'青浦区'</span>, <span class="hljs-string">'崇明区'</span>, <span class="hljs-string">'虹口区'</span>, <span class="hljs-string">'金山区'</span>, <span class="hljs-string">'宝山区'</span>, <span class="hljs-string">'长宁区'</span>, <span class="hljs-string">'全市'</span>], <br>    ordered=<span class="hljs-literal">True</span><br>)<br>df[<span class="hljs-string">'行政区'</span>] = df[<span class="hljs-string">'行政区'</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 = [<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 = pd.cut(contb_vs[<span class="hljs-string">'contb_receipt_amt'</span>],bins)<br>contb_vs[<span class="hljs-string">'label'</span>] = 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.where
和 np.select
再解释
df[<span class="hljs-string">'hasimage'</span>] = np.where(df[<span class="hljs-string">'photos'</span>]!= <span class="hljs-string">'[]'</span>, <span class="hljs-literal">True</span>, <span class="hljs-literal">False</span>)
store_patterns = [<br>    (df[<span class="hljs-string">'Store Name'</span>].str.contains(<span class="hljs-string">'Hy-Vee'</span>, case=<span class="hljs-literal">False</span>, regex=<span class="hljs-literal">False</span>), <span class="hljs-string">'Hy-Vee'</span>),<br>    (df[<span class="hljs-string">'Store Name'</span>].str.contains(<span class="hljs-string">'Central City'</span>,<br>                                case=<span class="hljs-literal">False</span>,  regex=<span class="hljs-literal">False</span>), <span class="hljs-string">'Central City'</span>),<br>    (df[<span class="hljs-string">'Store Name'</span>].str.contains(<span class="hljs-string">"Smokin' Joe's"</span>,<br>                                case=<span class="hljs-literal">False</span>,  regex=<span class="hljs-literal">False</span>), <span class="hljs-string">"Smokin' Joe's"</span>),<br>    (df[<span class="hljs-string">'Store Name'</span>].str.contains(<span class="hljs-string">'Walmart|Wal-Mart'</span>,<br>                                case=<span class="hljs-literal">False</span>), <span class="hljs-string">'Wal-Mart'</span>)<br>]<br><br>store_criteria, store_values = zip(*store_patterns)<br>df[<span class="hljs-string">'Store_Group_1'</span>] = np.select(store_criteria, store_values, <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>] = df.order_dt.dt.year<br>df[<span class="hljs-string">'month'</span>] = 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>] = pd.to_datetime(df[<span class="hljs-string">'date'</span>])<br>weekly_summary = df.story_point.resample(<span class="hljs-string">'W'</span>, on=<span class="hljs-string">'date'</span>).sum()
If need new column:
weekly_summary[<span class="hljs-string">'weekly'</span>] = df.story_point.resample(<span class="hljs-string">'W'</span>, on=<span class="hljs-string">'date'</span>).transform(<span class="hljs-string">'sum'</span>)
Or create DatetimeIndex:
df[<span class="hljs-string">'date'</span>] = pd.to_datetime(df[<span class="hljs-string">'date'</span>])<br>df = df.set_index(<span class="hljs-string">'date'</span>)<br>weekly_summary = df.story_point.resample(<span class="hljs-string">'W'</span>).sum()
If need new column:
weekly_summary[<span class="hljs-string">'weekly'</span>] = df.story_point.resample(<span class="hljs-string">'W'</span>).transform(<span class="hljs-string">'sum'</span>)
3.4. map
、 apply
、 applymap
、 transform
用法
map
: 针对Series
apply
: – 针对DataFramed
的轴向做运算,也就是说对行或列做运算,不能对单个元素做运算。运算结果返回去重长度的Series
。 – 针对Series
的元素进行运算。applymap
: 针对DataFrame
的元素做运算。-
transform
: 运算结果返回原长度的Series
。 -
Series
的方法 计算每一种水果的平均价格
dic = {<br>    <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>    <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>    <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>    <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 = DataFrame(dic)<br>mean_price = 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>] = df[<span class="hljs-string">'item'</span>].map(mean_price)
DataFramed
的方法, 返回去重长度的Series
- 作用:可以将
DataFramed
中的行或列数据进行某种形式的运算操作。
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">func</span><span class="hljs-params">(s)</span>:</span><br>    s = s.sum()<br>    print(s)<br>df.apply(func)
- 返回原长度的
Series
- 如果要用自定义函数增加新列或对原有列赋值,要用
transform
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">my_mean</span><span class="hljs-params">(s)</span>:</span><br>    sum = <span class="hljs-number">0</span><br>    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> s:<br>        sum += i<br>    <span class="hljs-keyword">return</span> sum / 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>] = df[<span class="hljs-string">'price'</span>] * df[<span class="hljs-string">'weight'</span>]<br>df2 = 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>] = 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 = 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>], <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 = {<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 = {<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 = new_index, columns = 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 = pd.merge(user_usage,<br>                 user_device[[<span class="hljs-string">'use_id'</span>, <span class="hljs-string">'platform'</span>, <span class="hljs-string">'device'</span>]],<br>                 on=<span class="hljs-string">'use_id'</span>,<br>                 how=<span class="hljs-string">'left'</span>)<br><br><br><br>devices.rename(columns={<span class="hljs-string">"Retail Branding"</span>: <span class="hljs-string">"manufacturer"</span>}, inplace=<span class="hljs-literal">True</span>)<br>result = pd.merge(result, <br>                  devices[[<span class="hljs-string">'manufacturer'</span>, <span class="hljs-string">'Model'</span>]],<br>                  left_on=<span class="hljs-string">'device'</span>,<br>                  right_on=<span class="hljs-string">'Model'</span>,<br>                  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())
另有 unique
、 nunique
等函数。
5.2. numpy中的函数
np.ptp(arr,axis=<span class="hljs-number">0</span>)
如果不用ptp,下面的写法就比较复杂了:
df_arr = 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() -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>, <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() <br><br>data.groupby(<span class="hljs-string">'month'</span>)[[<span class="hljs-string">'duration'</span>]].sum() 
聚合字典语法非常灵活,可以在操作之前定义。还可以使用 lambda 函数内联定义函数,以提取内置选项未提供的统计信息。
<span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> timedelta<br>aggregations = {<br>    <span class="hljs-string">'duration'</span>:<span class="hljs-string">'sum'</span>,<br>    <span class="hljs-string">'date'</span>: [<span class="hljs-keyword">lambda</span> x: max(x).date(), <span class="hljs-keyword">lambda</span> x: (max(x) - timedelta(days=<span class="hljs-number">1</span>)).date()]<br>}<br>grp = data.groupby(<span class="hljs-string">'month'</span>,as_index=<span class="hljs-literal">False</span>).agg(aggregations)<br>grp.columns = 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>, <span class="hljs-string">r'<lambda_0>'</lambda_0></span>:<span class="hljs-string">'date'</span>, <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>] = 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 = 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>               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 = [<span class="hljs-string">'user_id'</span>,<span class="hljs-string">'order_dt'</span>, <span class="hljs-string">'order_products'</span>, <span class="hljs-string">'order_amount'</span>]<br>df = pd.read_csv(<span class="hljs-string">'CDNOW_master.txt'</span>, names=columns, sep=<span class="hljs-string">'\s+'</span>)
- *pd.to_excel()对于dataframe数据的写入很方便,缺点是如果工作簿已经存在则会重置工作簿,即原工作簿的内容都会擦掉,而且不能(?)调格式。
    <span class="hljs-keyword">with</span> pd.ExcelWriter(xlsname) <span class="hljs-keyword">as</span> writer:<br>        df1.to_excel(writer, sheet_name=<span class="hljs-string">'XXX'</span>,index=<span class="hljs-literal">False</span>)<br>        df2.to_excel(writer, sheet_name=<span class="hljs-string">'YYY'</span>,index=<span class="hljs-literal">False</span>)
- openpyxl。
- 把dataframe数据用openpyxl写入excel优点是可以定向写入,不影响原内容(不设定其他参数的情况下,也不修改原单元格的格式,如字体字号加粗等),适合在已设定好格式的模板上指定位置填充数据。
    <span class="hljs-keyword">import</span> openpyxl <span class="hljs-keyword">as</span> op<br>    ontent_1 = <span class="hljs-string">'上海'</span> + str(int(month)) + <span class="hljs-string">'月'</span> + str(int(day)) + <span class="hljs-string">'日日报未直报机构汇总数('</span> + str(not_direct_report) + <span class="hljs-string">'家未直报,另有8280北德意志银行日报无数据)'</span><br>    file = <span class="hljs-string">'filename'</span><br>    <br>    wb = op.load_workbook(file)<br>    <br>    sh=wb[<span class="hljs-string">"AAA"</span>]<br>    <br>    sh.cell(<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,content_1)
- 缺点是对于dataframe数据的操作不友好,需要用循环,暂时还没学到别的高效的方法。
    sh=wb[<span class="hljs-string">"BBB"</span>]<br>    <br>    headlines = {<span class="hljs-number">1</span>:<span class="hljs-string">'aa'</span>, <span class="hljs-number">2</span>:<span class="hljs-string">'bb'</span>, <span class="hljs-number">3</span>:<span class="hljs-string">'cc'</span>, <span class="hljs-number">4</span>:<span class="hljs-string">'dd'</span>, <span class="hljs-number">5</span>:str(int(month)) + <span class="hljs-string">'月'</span> + str(int(day)) + <span class="hljs-string">'日余额'</span>, <span class="hljs-number">6</span>:<span class="hljs-string">'ee'</span>}<br>    <span class="hljs-keyword">for</span> col,headline <span class="hljs-keyword">in</span> headlines.items():<br>        sh.cell(<span class="hljs-number">1</span>,col,headline)<br>    sh.row_dimensions[<span class="hljs-number">1</span>].height = <span class="hljs-number">43.2</span><br>    <br>    <span class="hljs-keyword">for</span> col <span class="hljs-keyword">in</span> mx_not_direct_repo.columns:<br>        a = mx_not_direct_repo[col].tolist()<br>        <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(len(a)):<br>            sh.cell(i+<span class="hljs-number">2</span>,j,a[i])<br>        j += <span class="hljs-number">1</span>
9.1. 删除空值所在的行
- isna只能判断某个元素是否为NaN
df.isna()
any
和all
方法
any
方法的 axis
参数为 1
,表名对每一行的多列来说,最终形成一个字段 True
或 False
,效果就是列减少。参见 [[#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>] = [<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>] = [<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>] = [<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>] = [<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 = 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>] > (<span class="hljs-number">2</span> *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> pandas <span class="hljs-keyword">as</span> pd<br><span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np<br><span class="hljs-keyword">from</span> pandas <span class="hljs-keyword">import</span> DataFrame,Series<br>df = 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 = [<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>] == <span class="hljs-number">18</span>] = <span class="hljs-number">200</span><br>df<br><span class="hljs-string">"""<br>是否还有别的方法?<br>"""</span>
map
是 Seris
的一个方法。 map
传 字典可以进行映射操作。
dic_data = {<br>    <span class="hljs-string">'name'</span>:[<span class="hljs-string">'张三'</span>,<span class="hljs-string">'李四'</span>,<span class="hljs-string">'王老五'</span>],<br>    <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 = DataFrame(dic_data)<br>dic_map = {<br>    <span class="hljs-string">'张三'</span>:<span class="hljs-string">'tom'</span>,<br>    <span class="hljs-string">'李四'</span>:<span class="hljs-string">'jay'</span>,<br>    <span class="hljs-string">'王老五'</span>:<span class="hljs-string">'jerry'</span><br>}<br>df[<span class="hljs-string">'e_name'</span>] = df[<span class="hljs-string">'name'</span>].map(dic_map)<br>df
map
: 将列里面的所有的数据进行替换;如果不存在相关键值,则赋值NaNreplace
: 替换其中一部分np.select
: 可以替换,需设定好default值。
map
也可以用别的方式来达到替换某些索引行的目的,即 传入函数,而不是字典。这种方法可以替换 np.select
。
dic_map = {<br>    <span class="hljs-string">'张三'</span>:<span class="hljs-string">'tom'</span>,<br>    <span class="hljs-string">'李四'</span>:<span class="hljs-string">'jay'</span>,<br>}<br><br>f = <span class="hljs-keyword">lambda</span> x : dic_map.get(x,x)<br>df[<span class="hljs-string">'name'</span>] = df[<span class="hljs-string">'name'</span>].map(f)<br>df
替换行列名,可以用 rename
。参考[[#映射索引]]节。
map
函数可以做运算工具:
<br>df[<span class="hljs-string">'net_pay'</span>] = df[<span class="hljs-string">'salary'</span>].map(<span class="hljs-keyword">lambda</span> x: (x - <span class="hljs-number">3000</span>) * <span class="hljs-number">0.5</span> + <span class="hljs-number">3000</span>)<br>df
运算工具主要有 map
、 apply
、 applymap
,用法参考[[#map 、 apply 、 applymap 用法]]。
9.6. 随机抽样
- take
- permutation
<span class="hljs-string">"""<br>take的第一个参数只能用隐式索引,而不能用显式索引,因为这个列表一般是要自动生成的,而不是让用户自己写列名等操作。<br>"""</span><br>df = 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

注意:初始化过程中可能会遇到以下错误:
[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

此时的解决方案为:
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/
转载文章受原作者版权保护。转载请注明原作者出处!