質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
xlwings

xlwingsは、ExcelをPythonで操作するためのオープンソースライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1154閲覧

xlwingsで出力したDataFrameをExcel側でグラフにする際、空欄を0として扱われないようにしたい

throwsNullPo

総合スコア17

xlwings

xlwingsは、ExcelをPythonで操作するためのオープンソースライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/08/31 07:31

編集2022/01/12 10:55

試したこと

Excel側に表示したDataFrame由来のテーブルをグラフにする際、
「グラフのデザイン」⇒ 「データの選択」⇒ 「空白セルの表示方法」で[空白] or [データ要素を線で結ぶ]
を選択しても、空白セルの部分が0として扱われる。

エクセル側で見た目が空欄でも数式が入力されていると空白セルとして扱ってもらえないと思われる。
もしエクセル側で#N/Aとなる値をDataFrameの中に格納できれば0扱いされないと思われるが、その方法をざっと調べてみたが見当たらない(今格納されているのはnumpy.nan)

アプローチ

[1]実はエクセル側のグラフ設定で解決可能
[2]DataFrameに格納してxlwingsで出力すると#N/Aとなる値の作り方
[3]その他(データは複数列あるためDataFrameのdropna以外)
何かうまい方法・アイディアがあれば教えていただきたいです。

追記

「空欄が数式になっている」、とは以下のような状態です。
イメージ説明
test_naの中身は以下のように実装しており、これをA1セルにて=test_na()と実行すると上の画像のようになります。
入力したのはA1セルのみですがD6セル含めほかのセルにも=test_na()というのが薄字で表示(画像赤枠)されており、これがグラフにした際に0埋めされてしまう原因ではと考えています。

Python

1import xlwings as xw 2@xw.func 3def test_na(): 4 import pandas as pd 5 import numpy as np 6 df = pd.DataFrame() 7 df["x"] = list(range(0, 10)) 8 df["y1"] = [x - 0.1 for x in df["x"]] 9 df["y2"] = [x + 0.1 if i not in [4, 5, 6] else np.nan for i, x in enumerate(df["x"])] 10 return df

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hex309

2021/08/31 08:15

私の勘違いであれば申し訳ありません。 空白セルには数式が入力されている、ということでしょうか。 もしそうであれば、その数式を提示いただくことは可能ですか?
throwsNullPo

2021/08/31 09:14

確認ありがとうございます。本文にコードとExcel中の空欄表示のセルに自動入力される数式について追記しました。
guest

回答1

0

test_na関数の戻り値でなにかできないか少し試しましたが、難しいみたいですね。文字列として「#N/A」を返すことはできますが、文字列なのでExcel側はエラーとは認識してくれません。
無理やりですけど、一度test_na関数で値を吐き出したあと、関数が入力されている範囲をコピー→値貼り付けをしてどうか、という感じです(検証できてません)。

最初、インポートした際に生成されるVBAの関数を編集してしまえば良いように考えましたが、xlwingsは関数をインポートし直すと、編集は破棄されてしまうんですよね。
回答になっておらず申し訳ありません。

投稿2021/09/01 01:15

hex309

総合スコア761

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

throwsNullPo

2021/09/02 01:18

ありがとうございます。 [2]の方法は2019の情報ですがどうやら無理みたいですね。。。 https://github.com/xlwings/xlwings/issues/776 まさかな思いつつ以下を試すとA1セルも#N/Aにこそなりますが空欄も#N/Aになり、グラフの問題は解決しました。 =if(test_na()<>"", teset_na(), NA()) ただ二回test_na()が実行されていると思われるため、もっとエレガントなアイディアがあればご指摘いただきたいです。(iferrorのように、空文字じゃなかったら値をそのまま返す、みたいなことができる関数ってエクセルにありましたっけ?)
hex309

2021/09/02 01:52

そうでした。その方法がありましたね。 ただ、IFErrorのような関数はないので、致し方ないかと思います(VBAで関数作ってしまうこともできますが、それもどうかと思うので)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問