web-dev-qa-db-ja.com

データフレームのスペースを削除するpython

Csvから要素を呼び出してデータフレームを作成しようとしたため、コードでエラーが発生します。ファイルから呼び出す2つの列、CompanyNameとQualityIssueがあります。品質の問題には、機器の品質、ユーザー、およびどちらでもないという3つのタイプがあります。データフレームdf.EquipmentQualityを作成しようとすると問題が発生しますが、スペースがあるため、明らかに機能しません。元のファイルからEquipmentQualityを取得し、スペースをアンダースコアに置き換えたいと思います。

入力:

Top Calling Customers,         Equipment Quality,    User,    Neither,
Customer 3,                      2,           2,        0,
Customer 1,                      0,           2,        1,
Customer 2,                      0,           1,        0,
Customer 4,                      0,           1,        0,

これが私のコードです:

import numpy as np
import pandas as pd
import pandas.util.testing as tm; tm.N = 3

# Get the data.
data = pd.DataFrame.from_csv('MYDATA.csv')   
# Group the data by calling CompanyName and QualityIssue columns.
byqualityissue = data.groupby(["CompanyName", "QualityIssue"]).size() 
# Make a pandas dataframe of the grouped data.
df = pd.DataFrame(byqualityissue) 
# Change the formatting of the data to match what I want SpiderPlot to read.
formatted = df.unstack(level=-1)[0]  
# Replace NaN values with zero.
formatted[np.isnan(formatted)] = 0 
includingtotals = pd.concat([formatted,pd.DataFrame(formatted.sum(axis=1), 
                             columns=['Total'])], axis=1)
sortedtotal = includingtotals.sort_index(by=['Total'], ascending=[False])
sortedtotal.to_csv('byqualityissue.csv')

これはよくある質問のようで、私は多くの解決策を試しましたが、うまくいかなかったようです。これが私が試したものです:

with open('byqualityissue.csv', 'r') as f:
    reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE)
    return [[x.strip() for x in row] for row in reader]
    sentence.replace(" ", "_")

そして

sortedtotal['QualityIssue'] = sortedtotal['QualityIssue'].map(lambda x: x.rstrip(' ')) 

そして、私がここから最も有望だと思ったのは http://pandas.pydata.org/pandas-docs/stable/text.html

formatted.columns = formatted.columns.str.strip().str.replace(' ', '_')

しかし、私はこのエラーを受け取りました:AttributeError: 'インデックス'オブジェクトには属性 'str'がありません

よろしくお願いします!

9
jenryb

試してみてください:

formatted.columns = [x.strip().replace(' ', '_') for x in formatted.columns]
7
Alexander

私はあなたの質問を理解しているので、次のことがうまくいくはずです(注意したい場合は、inplace=Falseでテストして、最初にどのように見えるかを確認してください)。

sortedtotal.rename(columns=lambda x: x.replace(" ", "_"), inplace=True)

また、列名を囲む空白がある場合は、「この例」のようになります。

sortedtotal.rename(columns=lambda x: x.strip().replace(" ", "_"), inplace=True)

これは、先頭/末尾の空白を取り除き、内部スペースを「_」に変換します。

3
JBWhitmore