簡體   English   中英

如何在 python/pandas 中有效地創建索引和列名組合矩陣

[英]How to efficiently create a matrix of index and column names combinations in python/pandas

我想創建一個數據框/矩陣,其中每個條目都是相應索引和列名的串聯。 我可以用嵌套的 for 循環來做到這一點[見下文],但想知道是否有更好/更快的方法來做到這一點?

我的問題部分來自於不知道如何正確表達我正在嘗試做的事情。 我認為它就像矩陣乘法,但使用字符串和連接而不是乘法。 [因此,也歡迎任何關於如何更好地表達這個問題的評論]

我發現 itertools 有一個product() function可以做一些我想要的但創建一個生成器而不是返回一個矩陣/數據幀。

[動機; 在生物學中,我們有 96 孔板用於樣品儲存等。它們有 1-12 列和 AH 行。 一些機器返回井代碼(A3、G12 等)。 我想在板和實驗輸出之間生成 map 的代碼。]

import pandas as pd

rows = [x for x in "ABCDEFGH"]
columns = [str(x) for x in range(1, 13)]
wells = pd.DataFrame(columns=columns, index=rows)
for i in rows:
    for j in columns:
        wells.loc[i, j] = "".join([i, j])

>wells
Out[37]: 
   1   2   3   4   5   6   7   8   9    10   11   12
A  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12
B  B1  B2  B3  B4  B5  B6  B7  B8  B9  B10  B11  B12
C  C1  C2  C3  C4  C5  C6  C7  C8  C9  C10  C11  C12
D  D1  D2  D3  D4  D5  D6  D7  D8  D9  D10  D11  D12
E  E1  E2  E3  E4  E5  E6  E7  E8  E9  E10  E11  E12
F  F1  F2  F3  F4  F5  F6  F7  F8  F9  F10  F11  F12
G  G1  G2  G3  G4  G5  G6  G7  G8  G9  G10  G11  G12
H  H1  H2  H3  H4  H5  H6  H7  H8  H9  H10  H11  H12

您可以為此使用np.char.add()和廣播:

rows = [x for x in "ABCDEFGH"]
columns = [str(x) for x in range(1, 13)]
data = np.char.add(np.array(rows)[:, None], np.array(columns)[None, :])
wells = pd.DataFrame(data=data, columns=columns, index=rows)
#     1   2   3   4   5   6   7   8   9   10   11   12
# A  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12
# B  B1  B2  B3  B4  B5  B6  B7  B8  B9  B10  B11  B12
# C  C1  C2  C3  C4  C5  C6  C7  C8  C9  C10  C11  C12
# D  D1  D2  D3  D4  D5  D6  D7  D8  D9  D10  D11  D12
# E  E1  E2  E3  E4  E5  E6  E7  E8  E9  E10  E11  E12
# F  F1  F2  F3  F4  F5  F6  F7  F8  F9  F10  F11  F12
# G  G1  G2  G3  G4  G5  G6  G7  G8  G9  G10  G11  G12
# H  H1  H2  H3  H4  H5  H6  H7  H8  H9  H10  H11  H12

為什么不用純 python

wells = pd.DataFrame([[r+c for c in columns] for r in rows], columns=columns, index=rows)

您可以將 itertools 產品與 numpy 結合使用:

from itertools import product

frame = map("".join, product(rows, columns))
frame = np.fromiter(frame, dtype='U4')
frame = frame.reshape(len(rows), -1)
frame = pd.DataFrame(frame, index = rows, columns = columns)
frame
   1   2   3   4   5   6   7   8   9    10   11   12
A  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12
B  B1  B2  B3  B4  B5  B6  B7  B8  B9  B10  B11  B12
C  C1  C2  C3  C4  C5  C6  C7  C8  C9  C10  C11  C12
D  D1  D2  D3  D4  D5  D6  D7  D8  D9  D10  D11  D12
E  E1  E2  E3  E4  E5  E6  E7  E8  E9  E10  E11  E12
F  F1  F2  F3  F4  F5  F6  F7  F8  F9  F10  F11  F12
G  G1  G2  G3  G4  G5  G6  G7  G8  G9  G10  G11  G12
H  H1  H2  H3  H4  H5  H6  H7  H8  H9  H10  H11  H12

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM