一個(gè)表格中分為 行 和 列 ,有時(shí)候你經(jīng)常在網(wǎng)頁(yè)中看到類似這樣的表格,有時(shí)候是合并了列,有時(shí)候是合并了行。那么這個(gè)是怎么做的?也是通過下面的方法實(shí)現(xiàn)的。
向單元格添加屬性即可實(shí)現(xiàn),合并 列 和 行的屬性不一樣
1、合并列的屬性:clospan="2" //要合并幾列數(shù)字就是幾
2、合并行的屬性:rowspan="2" //同理,要合并幾行數(shù)字就是幾
3、合并后的單元格(行或列)必然會(huì)自動(dòng)多出來一個(gè),需要手動(dòng)刪掉。
4、重點(diǎn):合并單元格只和 td 標(biāo)簽有關(guān)系:
(1)合并列:是左右合并,在左側(cè)的 td 標(biāo)簽中添加 colspan="2" 要合并的 td 的數(shù)量。
(2)合并行:是上下合并,在上面的 td 標(biāo)簽中添加 rowspan="2" 要合并的td的數(shù)量。
(3)合并完后刪除多余的 td 標(biāo)簽。
1、合并 列 的用法:
(1)首先確定你要合并的單元格在第幾行第幾列,然后找到它,從他的td標(biāo)簽中添加屬性。
例如要合并第4行的,第4和第5列:
<tr>
<td>第三節(jié)</td>
<td>html</td>
<td>css</td>
<td colspan="2">php</td> <!-- 合并 列 的用法-->
<td>php</td>
</tr>
2、合并 行 的用法:
例如下面:合并第3行和第4行的第1列。
完整代碼:↓
者:Roman Orac
魚羊 編譯整理
量子位 報(bào)道 | 公眾號(hào) QbitAI
數(shù)據(jù)分析,如何能錯(cuò)過 Pandas 。
現(xiàn)在,數(shù)據(jù)科學(xué)家 Roman Orac 分享了他在工作中相見恨晚的 Pandas 使用技巧。
了解了這些技巧,能讓你在學(xué)習(xí)、使用 Pandas 的時(shí)候更加高效。
話不多說,一起學(xué)習(xí)一下~
用 Pandas 做數(shù)據(jù)分析,最大的亮點(diǎn)當(dāng)屬 DataFrame。不過,在展示成果的時(shí)候,常常需要把 DataFrame 轉(zhuǎn)成另一種格式。
Pandas 在這一點(diǎn)上其實(shí)十分友好,只需添加一行代碼。
DataFrame 轉(zhuǎn) HTML
如果你需要用 HTML 發(fā)送自動(dòng)報(bào)告,那么 to_html 函數(shù)了解一下。
比如,我們先設(shè)定這樣一個(gè) DataFrame:
import numpy as np
import pandas as pd
import random
n = 10
df = pd.DataFrame(
{
"col1": np.random.random_sample(n),
"col2": np.random.random_sample(n),
"col3": [[random.randint(0, 10) for _ in range(random.randint(3, 5))] for _ in range(n)],
}
)
用上 to_html,就可以將表格轉(zhuǎn)入 html 文件:
df_html = df.to_html()
with open(‘a(chǎn)nalysis.html’, ‘w’) as f: f.write(df_html)
與之配套的,是 read_html 函數(shù),可以將 HTML 轉(zhuǎn)回 DataFrame。
DataFrame 轉(zhuǎn) LaTeX
如果你還沒用過 LaTeX 寫論文,強(qiáng)烈建議嘗試一下。
要把 DataFrame 值轉(zhuǎn)成 LaTeX 表格,也是一個(gè)函數(shù)就搞定了:
df.to_latex()
DataFrame 轉(zhuǎn) Markdown
如果你想把代碼放到 GitHub 上,需要寫個(gè) README。
這時(shí)候,你可能需要把 DataFrame 轉(zhuǎn)成 Markdown 格式。
Pandas 同樣為你考慮到了這一點(diǎn):
print(df.to_markdown())
注:這里還需要 tabulate 庫(kù)
DataFrame 轉(zhuǎn) Excel
說到這里,給同學(xué)們提一個(gè)小問題:導(dǎo)師/老板/客戶要你提供 Excel 格式的數(shù)據(jù),你該怎么做?
當(dāng)然是——
df.to_excel(‘a(chǎn)nalysis.xlsx’)
需要注意的是,如果你沒有安裝過 xlwt 和 openpyxl 這兩個(gè)工具包,需要先安裝一下。
另外,跟 HTML 一樣,這里也有一個(gè)配套函數(shù):read_excel,用來將excel數(shù)據(jù)導(dǎo)入pandas DataFrame。
DataFrame 轉(zhuǎn)字符串
轉(zhuǎn)成字符串,當(dāng)然也沒問題:
df.to_string()
此前,Roman Orac 還曾分享過 5 個(gè)他覺得十分好用,但大家可能沒有那么熟悉的 Pandas 技巧。
1、data_range
從外部 API 或數(shù)據(jù)庫(kù)獲取數(shù)據(jù)時(shí),需要多次指定時(shí)間范圍。
Pandas 的 data_range 覆蓋了這一需求。
import pandas as pd
date_from = “2019-01-01”
date_to = “2019-01-12”
date_range = pd.date_range(date_from, date_to, freq=”D”)
print(date_range)
freq = “D”/“M”/“Y”,該函數(shù)就會(huì)分別返回按天、月、年遞增的日期。
2、合并數(shù)據(jù)
當(dāng)你有一個(gè)名為left的DataFrame:
和名為right的DataFrame:
想通過關(guān)鍵字“key”把它們整合到一起:
實(shí)現(xiàn)的代碼是:
df_merge = left.merge(right, on = ‘key’, how = ‘left’, indicator = True)
3、最近合并(Nearest merge)
在處理股票或者加密貨幣這樣的財(cái)務(wù)數(shù)據(jù)時(shí),價(jià)格會(huì)隨著實(shí)際交易變化。
針對(duì)這樣的數(shù)據(jù),Pandas提供了一個(gè)好用的功能,merge_asof。
該功能可以通過最近的key(比如時(shí)間戳)合并DataFrame。
舉個(gè)例子,你有一個(gè)存儲(chǔ)報(bào)價(jià)信息的DataFrame。
還有一個(gè)存儲(chǔ)交易信息的DataFrame。
現(xiàn)在,你需要把兩個(gè)DataFrame中對(duì)應(yīng)的信息合并起來。
最新報(bào)價(jià)和交易之間可能有10毫秒的延遲,或者沒有報(bào)價(jià),在進(jìn)行合并時(shí),就可以用上 merge_asof。
pd.merge_asof(trades, quotes, on=”timestamp”, by=’ticker’, tolerance=pd.Timedelta(‘10ms’), direction=‘backward’)
4、創(chuàng)建Excel報(bào)告
在Pandas中,可以直接用DataFrame創(chuàng)建Excel報(bào)告。
import numpy as np
import pandas as pd
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=["a", "b", "c"])
report_name = 'example_report.xlsx'
sheet_name = 'Sheet1'
writer = pd.ExcelWriter(report_name, engine='xlsxwriter')
df.to_excel(writer, sheet_name=sheet_name, index=False)
不只是數(shù)據(jù),還可以添加圖表。
# define the workbook
workbook = writer.book
worksheet = writer.sheets[sheet_name]
# create a chart line object
chart = workbook.add_chart({'type': 'line'})
# configure the series of the chart from the spreadsheet
# using a list of values instead of category/value formulas:
# [sheetname, first_row, first_col, last_row, last_col]
chart.add_series({
'categories': [sheet_name, 1, 0, 3, 0],
'values': [sheet_name, 1, 1, 3, 1],
})
# configure the chart axes
chart.set_x_axis({'name': 'Index', 'position_axis': 'on_tick'})
chart.set_y_axis({'name': 'Value', 'major_gridlines': {'visible': False}})
# place the chart on the worksheet
worksheet.insert_chart('E2', chart)
# output the excel file
writer.save()
注:這里需要 XlsxWriter 庫(kù)
5、節(jié)省磁盤空間
Pandas在保存數(shù)據(jù)集時(shí),可以對(duì)其進(jìn)行壓縮,其后以壓縮格式進(jìn)行讀取。
先搞一個(gè) 300MB 的 DataFrame,把它存成 csv。
df = pd.DataFrame(pd.np.random.randn(50000,300))
df.to_csv(‘random_data.csv’, index=False)
壓縮一下試試:
df.to_csv(‘random_data.gz’, compression=’gzip’, index=False)
文件就變成了136MB。
gzip壓縮文件可以直接讀取:
df = pd.read_csv(‘random_data.gz’)
這一份Pandas技巧筆記,暫且說到這里。各位同學(xué)都做好筆記了嗎?
Talk is cheap, show me the code。學(xué)會(huì)了,就用起來吧
— 完 —
量子位 QbitAI · 頭條號(hào)簽約
關(guān)注我們,第一時(shí)間獲知前沿科技動(dòng)態(tài)
Markdown表格的語(yǔ)法如下:
| | | | |
| - | - | - | - |
| | | | |
顯示效果如下:
姓名 | 性別 | 年齡 | 生日 |
張小凡 | 男 | 13 | - |
陸雪琪 | 女 | 16 | - |
碧瑤 | 女 | 15 | - |
我們可以:在第二行,也就是表頭下面的一行,去規(guī)定它是左對(duì)齊,右對(duì)齊,或者是居中,分別是:-,-:,:-:,除此之外,就沒有其他的控制的方式了,markdown對(duì)于表格的控制是比較弱的,比如說表格的合并,markdown自身就無能為力了,好在它支持html的語(yǔ)法,我們也可以實(shí)現(xiàn)表格的控制。
姓名 | 性別 | 年齡 | 生日 |
張小凡 | 男 | 13 | - |
陸雪琪 | 女 | 16 | - |
碧瑤 | 女 | 15 | - |
html之中,使用table作為表格
table表示表格,里面的元素有表頭,行,單元格
th表示表頭,tr表示行,td表示單元格
第1列 | 第2列 | 第3列 | 第4列 |
1 | 2 | 3 | 第4列 |
1 | 2 | 3 | 第4列 |
1 | 2 | 3 | 第4列 |
1 | 2 | 3 | 第4列 |
<table>
<th>第1列</th><th>第2列</th><th>第3列</th><th>第4列</th>
<tr>
<td>1</td><td>2</td><td>3</td><td>第4列</td>
</tr>
<tr>
<td>1</td><td>2</td><td>3</td><td>第4列</td>
</tr>
<tr>
<td>1</td><td>2</td><td>3</td><td>第4列</td>
</tr>
<tr>
<td>1</td><td>2</td><td>3</td><td>第4列</td>
</tr>
</table>
同一行的單元格要合并,那就是一個(gè)單元格,占多個(gè)單元格的位置,位置是span,就可以使用colspan = "x",來表示所在的單元格占多少個(gè)格子。
第1列 | 第2列 | 第3列 | 第4列 |
1 | 2 | 3 | 第4列 |
1 | 第4列 | ||
1 | 2 | 3 | 第4列 |
1 | 2 | 3 | 第4列 |
<table>
<th>第1列</th><th>第2列</th><th>第3列</th><th>第4列</th>
<tr>
<td>1</td><td>2</td><td>3</td><td>第4列</td>
</tr>
<tr>
<td colspan="3">1</td><td>第4列</td>
</tr>
<tr>
<td>1</td><td>2</td><td>3</td><td>第4列</td>
</tr>
<tr>
<td>1</td><td>2</td><td>3</td><td>第4列</td>
</tr>
</table>
同一列的單元格要合并,那就是一個(gè)單元格,占多行單元格的位置,位置是span,就可以使用rowspan = "x",來表示所在的單元格占多少個(gè)列方向的單元格。
第1列 | 第2列 | 第3列 | 第4列 |
1 | 2 | 3 | 第4列 |
1 | 2 | 3 | 第4列 |
1 | 2 | 3 | |
1 | 2 | 3 |
<table>
<th>第1列</th><th>第2列</th><th>第3列</th><th>第4列</th>
<tr>
<td>1</td><td>2</td><td>3</td><td>第4列</td>
</tr>
<tr>
<td rowspan="3">1</td><td>2</td><td>3</td><td>第4列</td>
</tr>
<tr>
<td>1</td><td>2</td><td>3</td>
</tr>
<tr>
<td>1</td><td>2</td><td>3</td>
</tr>
</table>
這個(gè)時(shí)候,就需要把colspan = "x"和rowspan = "x",同時(shí)使用了,下面是二者沒有關(guān)系的一種情況。
第1列 | 第2列 | 第3列 | 第4列 |
1 | 2 | 3 | |
1 | 2 | 3 | 第4列 |
1 | 2 | 3 | |
1 | 2 | 3 |
<table>
<th>第1列</th><th>第2列</th><th>第3列</th><th>第4列</th>
<tr>
<td>1</td><td>2</td><td colspan="2">3</td>
</tr>
<tr>
<td rowspan="3">1</td><td>2</td><td>3</td><td>第4列</td>
</tr>
<tr>
<td>1</td><td>2</td><td>3</td>
</tr>
<tr>
<td>1</td><td>2</td><td>3</td>
</tr>
</table>
下面是二者之間相互關(guān)聯(lián)的一種情況。
第1列 | 第2列 | 第3列 | 第4列 |
1 | 2 | 3 | 第4列 |
1 | 2 | ||
1 | |||
1 |
<table>
<th>第1列</th><th>第2列</th><th>第3列</th><th>第4列</th>
<tr>
<td>1</td><td>2</td><td>3</td><th>第4列</th>
</tr>
<tr>
<td colspan=3 rowspan =3>1</td><td>2</td>
</tr>
<tr>
<td>1</td>
</tr>
<tr>
<td>1</td>
</tr>
</table>
分析:主要是縱向的表格的合并,文字放置在表格的中間,表格頭背景顏色設(shè)為粉紅色,然后表頭文字是紅色。我們開始實(shí)現(xiàn)。
效果
1.先去處理第一列的單元格,占據(jù)3個(gè)單元格,整體的顯示效果和代碼如下:
派別 | 姓名 | 年齡 | 性別 | 武器 |
1 | 2 | 3 | 4 | 5 |
2 | 3 | 4 | 5 | |
2 | 3 | 4 | 5 |
<table>
<th>派別</th><th>姓名</th><th>年齡</th><th>性別</th><th>武器</th>
<tr>
<!-- 列的方向占據(jù)3個(gè)cell -->
<td rowspan='3'>1</td><td>2</td><td>3</td><td>4</td><td>5</td>
</tr>
<tr>
<td>2</td><td>3</td><td>4</td><td>5</td>
</tr>
<tr>
<td>2</td><td>3</td><td>4</td><td>5</td>
</tr>
</table>
2.然后處理第4列的兩個(gè)單元格,也是縱向的,合并的單元格,會(huì)自動(dòng)占據(jù)它所合并的方向的位置,相應(yīng)的位置,計(jì)算的時(shí)候會(huì)在下一行或者相鄰的列里面也計(jì)算在內(nèi),它下面的一個(gè)元素,自動(dòng)跟在這個(gè)“隱藏元素”的后面。比如青云山,男這兩個(gè)元素的位置,就體現(xiàn)了這個(gè)原則。整體的顯示效果和代碼如下:
派別 | 姓名 | 年齡 | 性別 | 武器 |
青云山 | 2 | 3 | 男 | 5 |
2 | 3 | 5 | ||
2 | 3 | 4 | 5 | |
1 | 2 | 3 | 4 | 5 |
<table>
<th>派別</th><th>姓名</th><th>年齡</th><th>性別</th><th>武器</th>
<tr>
<!-- 列的方向占據(jù)3個(gè)cell -->
<td rowspan='3'>青云山</td><td>2</td><td>3</td><td rowspan='2'>男</td><td>5</td>
</tr>
<tr>
<td>2</td><td>3</td><td>5</td>
</tr>
<tr>
<td>2</td><td>3</td><td>4</td><td>5</td>
</tr>
<tr>
<td>1</td><td>2</td><td>3</td><td>4</td><td>5</td>
</tr>
</table>
3.然后我們實(shí)現(xiàn)居中,使用style,對(duì)于整個(gè)table設(shè)置,也可以對(duì)某個(gè)tr,或者某一個(gè)td使用,越小的控制,起作用的優(yōu)先級(jí)越高,比如第2行,設(shè)置向右對(duì)齊,它的優(yōu)先級(jí)高于整個(gè)table的設(shè)置。整體的顯示效果和代碼如下:
派別 | 姓名 | 年齡 | 性別 | 武器 |
青云山 | 2 | 3 | 男 | 5 |
2 | 3 | 5 | ||
2 | 3 | 4 | 5 | |
1 | 2 | 3 | 4 | 5 |
<table style="text-align:center;">
<th>派別</th><th>姓名</th><th>年齡</th><th>性別</th><th>武器</th>
<tr>
<!-- 列的方向占據(jù)3個(gè)cell -->
<td rowspan='3'>青云山</td><td>2</td><td>3</td><td rowspan='2'>男</td><td>5</td>
</tr>
<tr style="text-align:right;">
<td>2</td><td>3</td><td>5</td>
</tr>
<tr>
<td>2</td><td>3</td><td>4</td><td>5</td>
</tr>
<tr>
<td>1</td><td>2</td><td>3</td><td>4</td><td>5</td>
</tr>
</table>
4.實(shí)現(xiàn)其他的表格合并的效果,整體的顯示效果和代碼如下:
派別 | 姓名 | 年齡 | 性別 | 武器 |
青云山 | 2 | 3 | 男 | 5 |
2 | 3 | 5 | ||
2 | 3 | 4 | 5 | |
1 | 2 | 3 | 男 | 5 |
鬼王宗 | 2 | 3 | 5 | |
2 | 3 | 4 | 5 |
<table style="text-align:center;">
<th>派別</th><th>姓名</th><th>年齡</th><th>性別</th><th>武器</th>
<tr>
<!-- 列的方向占據(jù)3個(gè)cell -->
<td rowspan='3'>青云山</td><td>2</td><td>3</td><td rowspan='2'>男</td><td>5</td>
</tr>
<tr>
<td>2</td><td>3</td><td>5</td>
</tr>
<tr>
<td>2</td><td>3</td><td>4</td><td>5</td>
</tr>
<tr>
<td>1</td><td>2</td><td>3</td><td rowspan=2>男</td><td>5</td>
</tr>
<tr>
<td rowspan=2>鬼王宗</td><td>2</td><td>3</td><td>5</td>
</tr>
<tr>
<td>2</td><td>3</td><td>4</td><td>5</td>
</tr>
</table>
5.填充數(shù)據(jù)
派別 | 姓名 | 年齡 | 性別 | 武器 |
青云山 | 張小凡 | 16 | 男 | 燒火棍 |
曾書書 | 17 | 軒轅 | ||
陸雪琪 | 18 | 女 | 天琊 | |
天音寺 | 普智 | 500 | 男 | 嗜血珠 |
鬼王宗 | 鬼王 | 1000 | 朱雀印 | |
碧瑤 | 15 | 女 | 傷心花 |
<table style="text-align:center;">
<th>派別</th><th>姓名</th><th>年齡</th><th>性別</th><th>武器</th>
<tr>
<!-- 列的方向占據(jù)3個(gè)cell -->
<td rowspan='3'>青云山</td><td>張小凡</td><td>16</td><td rowspan='2'>男</td><td>燒火棍</td>
</tr>
<tr>
<td>曾書書</td><td>17</td><td>軒轅</td>
</tr>
<tr>
<td>陸雪琪</td><td>18</td><td>女</td><td>天琊</td>
</tr>
<tr>
<td>天音寺</td><td>普智</td><td>500</td><td rowspan=2>男</td><td>嗜血珠</td>
</tr>
<tr>
<td rowspan=2>鬼王宗</td><td>鬼王</td><td>1000</td><td>朱雀印</td>
</tr>
<tr>
<td>碧瑤</td><td>15</td><td>女</td><td>傷心花</td>
</tr>
</table>
6.修改表頭樣式,仍然是使用style,修改背景色background-color,字體顏色color就可以了。
派別 | 姓名 | 年齡 | 性別 | 武器 |
青云山 | 張小凡 | 16 | 男 | 燒火棍 |
曾書書 | 17 | 軒轅 | ||
陸雪琪 | 18 | 女 | 天琊 | |
天音寺 | 普智 | 500 | 男 | 嗜血珠 |
鬼王宗 | 鬼王 | 1000 | 朱雀印 | |
碧瑤 | 15 | 女 | 傷心花 |
<table style="text-align:center;">
<th style="background-color:#ffc7ce; color: #cb464b">派別</th>
<th style="background-color:#ffc7ce; color: #cb464b">姓名</th>
<th style="background-color:#ffc7ce; color: #cb464b">年齡</th>
<th style="background-color:#ffc7ce; color: #cb464b">性別</th>
<th style="background-color:#ffc7ce; color: #cb464b">武器</th>
<tr>
<!-- 列的方向占據(jù)3個(gè)cell -->
<td rowspan='3'>青云山</td><td>張小凡</td><td>16</td><td rowspan='2'>男</td><td>燒火棍</td>
</tr>
<tr>
<td>曾書書</td><td>17</td><td>軒轅</td>
</tr>
<tr>
<td>陸雪琪</td><td>18</td><td>女</td><td>天琊</td>
</tr>
<tr>
<td>天音寺</td><td>普智</td><td>500</td><td rowspan=2>男</td><td>嗜血珠</td>
</tr>
<tr>
<td rowspan=2>鬼王宗</td><td>鬼王</td><td>1000</td><td>朱雀印</td>
</tr>
<tr>
<td>碧瑤</td><td>15</td><td>女</td><td>傷心花</td>
</tr>
</table>
以上就是實(shí)戰(zhàn)環(huán)節(jié),完成了既定的目標(biāo)的表格的單元格合并與樣式的改造,over!
據(jù)說VLOOK可以,但是我測(cè)試了之后,不行,合并單元格功能無法正常使用。
如果你沒有html基礎(chǔ),或者是覺得麻煩,或者是不太想去寫表格,沒關(guān)系,也有辦法,直接生成,按照目標(biāo)樣式自定義去合并,設(shè)置樣式,然后生成,拷貝到typora之中即可!?。》奖憧旖?,省時(shí)省力!!!只需瀏覽器收藏url:https://www.tablesgenerator.com/html_tables,因?yàn)槲覀儸F(xiàn)在實(shí)現(xiàn)表格的合并,是通過html的語(yǔ)法來完成的,而tablesgenerator網(wǎng)站可以幫我們實(shí)現(xiàn)表格的合并,我們只需要復(fù)制其中的代碼,然后即可。
生成table
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。