簡體   English   中英

如何使 Pandas DataFrame (Python) 以二維 (2-D) 矩陣格式顯示每個單元格

[英]how to make Pandas DataFrame (Python) to display each cell in a two dimensional (2-D) matrix format

我正在嘗試使用 Python 中導入的 Matlab 結構創建二維 (2-D) 數據結構。

當我使用 pandas.DataFrame 時,每個單元格都包含一個矩陣,但是它們以列表格式顯示。 我正在嘗試將其更改為 Matrix 格式。

使用以下代碼,Python 中的 DataFrame 看起來很相似:(但是,它並不相同,因為實際數據是從 Matlab 導入的,並且具有不同的類型,我無法使用 python 重新創建它)

import pandas as pd
k=[[0,1,2,3,4,5,6]]
df=pd.DataFrame(k)
df[:] = df[:].astype('object')
df.at[0,0] = [[1]]
df.at[0,1] = [[1.0,2.0],[2.0,4.0],[8.0,3.0],[9.0,7.0]]
df.at[0,2] = [[0.487],[1.532],[1.544],[1.846]]
df.at[0,3] = [[3.0]]
df.at[0,4] = [[3.0]]
df.at[0,5] = [[-1]]
df.at[0,6] = [[]]
display(df)

結果是:

Result_of_the_code

(您也可以通過運行以下代碼片段找到類似的結果。)

 <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>0</th> <th>1</th> <th>2</th> <th>3</th> <th>4</th> <th>5</th> <th>6</th> </tr> </thead> <tbody> <tr> <th>0</th> <td>[[1]]</td> <td>[[1.0, 2.0], [2.0, 4.0], [8.0, 3.0], [9.0, 7.0]]</td> <td>[[0.487], [1.5326], [1.544], [1.846]]</td> <td>[[3.0]]</td> <td>[[3.0]]</td> <td>[[-1]]</td> <td>[[]]</td> </tr> </tbody> </table>

如您所見,每個單元格都顯示為一個列表,即:

Displayed_matrix_as_list_form

(您也可以通過運行以下代碼片段找到類似的結果。)

 <body> [[1.0, 2.0], [2.0, 4.0], [8.0, 3.0], [9.0, 7.0]] </body>

我正在嘗試將其更改為

預期結果

(您也可以通過運行以下代碼片段找到類似的結果。)

 .matrix { position: relative; }.matrix:before, .matrix:after { content: ""; position: absolute; top: 0; border: 1px solid #000; width: 6px; height: 100%; }.matrix:before { left: -10px; border-right: -0; }.matrix:after { right: -10px; border-left: 0; }
 <div align=center> <table class="matrix"> <tr> <td>1</td> <td>2</td> </tr> <tr> <td>2</td> <td>4</td> </tr> <tr> <td>8</td> <td>3</td> </tr> <tr> <td>9</td> <td>7</td> </tr> </table> </div>

謝謝。

Pandas 有一個默認的 output 打印機將無法實現您的需要。 但是,您可以使用pandas.Styler創建 HTML,然后將 HTML 插入 DataFrame,然后使用您提供的必要 CSS 88305941579:788 呈現 HTML

data = [
    [[1]],
    [[1.0,2.0],[2.0,4.0],[8.0,3.0],[9.0,7.0]],
    [[0.487],[1.532],[1.544],[1.846]],
    [[3.0]],
    [[3.0]],
    [[-1]],
]
    
df = pd.DataFrame([
    [(pd.DataFrame(x)
        .style
        .hide_index()
        .hide_columns()
        .set_table_attributes('class="matrix"')
        .to_html()
     ) for x in data]
], dtype="object")
df.style.set_table_styles([
    {"selector": ".matrix", "props": "position: relative;"},
    {"selector": ".matrix:before, .matrix:after", 
     "props":  'content: ""; position: absolute; top: 0; border: 1px solid #000; width: 6px; height: 100%;'
    },
    {"selector": ".matrix:before", "props": "left: -0px; border-right: -0;"},
    {"selector": ".matrix:after", "props": "right: -0px; border-left: 0;"}
])

在此處輸入圖像描述

@Attack68,這是我在回復你漂亮的答案時提到的代碼。 請記住,正如我提到的,真實數據是從 Matlab 結構導入的。 這意味着它不適用於我在問題本身中提供的數據,但適用於使用 scipy.io 導入到 python 的 Matlab 結構。 我在@Valdi_Bo answer on link@Paul Panzer answer on link的幫助下編寫了這段代碼。

df = pd.DataFrame(data)

import re 
def pretty_col(data):
     data=np.array(data)
     if data.size <= 1:
         return format(data)
     else:
         return format(data[:, None])[1:-1].replace('[', '\u23A1', 1).replace(' [', '\u23A2', data.size-2).replace(' [', '\u23A3').replace(']', '\u23A4', 1).replace(']', '\u23A5', data.size-2).replace(']', '\u23A6')
def pretty_cols(data, comma=False):
    if comma:
        f='\n'.join(line[0] + line + line[-1] for line in map(str.join, data.shape[0] // 2 * ('  ',) + (', ',) + (data.shape[0] - 1) // 2 * ('  ',), zip(*map(str.split, map(pretty_col, data.T), data.shape[1]*('\n',)))))
    else:
        f='\n'.join(line[0] + line + line[-1] for line in map(''.join, zip(*map(str.split, map(pretty_col, data.T), data.shape[1]*('\n',)))))
    return f

def myFmt(txt):
    if txt=="":
        return "[]"
    else:
        q=r'<font">bananas\n</font>'
        q=q.replace("bananas", repr(txt))
        q=q.replace("'", '')
        return q.replace(r'\n', '<br>')
def ttest(x):
    for i,k in enumerate(x):
        for j,l in enumerate(k):
            x[i][j]=float(format(l, '.2f'))
            return x

def transform(tdf,prec):
    for col in tdf.columns:
        tdf[col] = tdf[col].apply(pretty_cols)
        for j in range(len(tdf[col])):
            tdf[col][j]=fixing_newline(tdf[col][j],prec)


print(df[df.columns[0]])
def fixing_newline(string,prec):
    string=string.replace("⎡⎡", ' aa ').replace("⎤⎤", ' bb ').replace("\n", ' cc ').replace("⎢⎢", ' dd ').replace("⎥⎥", ' ee ').replace("⎣⎣", ' ff ').replace("⎦⎦", ' gg ').replace("[[", ' hh ').replace("]]", ' kk ')
    chunks = string.split(' ')
    string=""
    for i,k in enumerate(chunks):
        try: 
            string+=str("{:."+str(prec)+"f}").format(float(k))
        except ValueError:
            string+=k
    string=string.replace("aa", "⎡⎡").replace("bb", '⎤⎤').replace("cc", '\n').replace("dd", '⎢⎢').replace("ee", '⎥⎥').replace("ff", '⎣⎣').replace("gg", '⎦⎦').replace("hh", '[[').replace("kk", ']]')
    return string


transform(df,3)
df=df.style.format(myFmt)

display(df)

這將導致類似的結果:結果(需要內聯圖像方面的幫助,因為我沒有足夠的聲譽。)

但是,代碼根本沒有效率,而且也不是一直都能正常工作。

暫無
暫無

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

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