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

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

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

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

Q&A

解決済

3回答

1256閲覧

データフレームにhexがある場合、自動で認識し、10進数に変換したい

hima2b4

総合スコア33

Python

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

0グッド

0クリップ

投稿2022/04/24 15:20

データフレームにhexデータがある場合、カラムを指定してを指定して10進数に変換することはできるのですが、できればpythonで自動検出、自動変換させたいので、ご存知の方ご存知の方おられましたらご教示をお願いいたします。

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

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

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

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

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

YT0014

2022/04/25 01:50

hima2b4さんの仰る「hexデータ」を他のデータ(10進データ?)と区別する条件を明示してください。 文字列、かつ、0xで始まる0-9とa-f、A-Fのみで構成されるデータ、などが考えられますが。 なお、以上のコメントに対するご返答は、この欄ではなく、質問を編集することでご対応ください。
hima2b4

2022/04/25 04:58

YT0014さん、ご意見ありがとうございます。 仰る通り、いろいろケースはあると思いますが、ひとまずはmelianさんの回答で解決できそうです。
guest

回答3

0

python

1import pandas as pd 2 3df = pd.DataFrame({ 4 'a': [1, 2, 3], 5 'b': ['1C8', '0C3A', '9F07D2'], 6 'c': [12.3, 66.7, 84.5], 7 'd': ['Hello', 'Hi', 'Bye'], 8}) 9 10def hex_to_int(s): 11 try: 12 return int(s, base=16) 13 except: 14 return s 15 16dfx = df.applymap(hex_to_int) 17 18print(f'df: \n{df}') 19print(f'\ndfx: \n{dfx}') 20 21# 22df: 23 a b c d 240 1 1C8 12.3 Hello 251 2 0C3A 66.7 Hi 262 3 9F07D2 84.5 Bye 27 28dfx: 29 a b c d 300 1 456 12.3 Hello 311 2 3130 66.7 Hi 322 3 10422226 84.5 Bye

投稿2022/04/25 03:21

melian

総合スコア19618

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

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

hima2b4

2022/04/25 04:58

melianさん、ご丁寧に回答いただき、誠にありがとうございました。 恥ずかしながら、try, except, applymapは初見でした。 引数の値が16進数の場合はintとし、そうでなければ引数をそのまま返すという関数をデータフレーム全体に適用するということですね。なるほど。こんな風にできるんですね。とても勉強になりました。
YT0014

2022/04/25 09:48

y_waiwaiさんの回答のコメントと矛盾していますが、問題ないのですか? この処理の場合、'abc'は、文字列ではなく、16進として処理されるかと思います。 また、'100'は、10進の100ではなく16進の0x100=256となりますが、それで良いのでしょうか?
hima2b4

2022/05/03 03:30

すいません。先程コメントに気がつきました。 仰る通りですね。 16進数があるか否かは列に依存しますので、列毎にhex数を数え、大部分がhexの列のみ処理するようにしたいと思います。 他にもよいアイデアあれば、ご教示いただけますと幸いです。
guest

0

自己解決

melianさんからのアドバイスに飛びついてしまったのですが、
y_waiwaiさん、YT0014さんからのご指摘通り、変換したいデータ以外(‘abc’など)も10進数としてしまいますね。

string.hexdigits の存在を知りました。

a = '1C8','0C3A','9F07D2','ffff','ffgf','7b2FF00FF'

import string

list = []
for i in a:
result = set(i).issubset(set(string.hexdigits))
list.append(result)
print(list)

#[True, True, True, True, False, True]

データフレームの列毎に実行して、全てTrueなら、10進数への変換処理実行とできれば、というところです。
とはいえ、列毎の処理をどうすりゃいいものか。。。まだまだです。

投稿2022/04/25 05:01

編集2022/05/06 11:20
hima2b4

総合スコア33

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

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

0

abc とあるとき、文字列とするのか16進数とするのかどっちでしょうか

投稿2022/04/24 15:26

y_waiwai

総合スコア87719

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

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

hima2b4

2022/04/25 05:00

y_waiwaiさん、コメントありがとうございます。abcとある時は文字列のままと想定しております。
y_waiwai

2022/04/25 06:43

なら0abc は? 文字列と16進数の違いは何を持って判定するんでしょう
hima2b4

2022/05/08 06:56

y_waiwaiさんのご指摘通りです。理解が甘かったです。 データフレームのカラム毎に16進数判定ができるとよいのですが、私はうまくできませんので、10進数に変換するカラムを指定して実行することにしました。 df = pd.DataFrame({ 'a': [1, 2, 3,100,110,200], 'b': ['1C8', '0C3A', '9F07D2','ffff','ffff','7b2'], 'c': [12.3, 66.7, 84.5,200.2,300.5,1200], 'd': ['A', '100', 'a','abc','AB','ZA-20'] 以下を実行しますと、 def hex_to_int(s): try: return int(s, base=16) except: return s #処理前のdf a b c d 0 1 1C8 12.3 A 1 2 0C3A 66.7 100 2 3 9F07D2 84.5 a 3 100 ffff 200.2 abc 4 110 ffff 300.5 AB 5 200 7b2 1200.0 ZA-20 #処理後のdf a b c d 0 1 456 12.3 10 1 2 3130 66.7 256 2 3 10422226 84.5 10 3 100 65535 200.2 2748 4 110 65535 300.5 171 5 200 1970 1200.0 ZA-20 カラムdのA, 100, a, abc, AB が16進数に変換されます。 これがご指摘の内容ですね。 先の通り、カラムを指定して、以下のように処理させました。 hex_to_int_label = 'b' #@param {type:"raw"} #colabのフォーム for i in hex_to_int_label: if df[col].dtype == 'object': df[i]=df[i].apply(lambda x:int(x, 16)) df #処理後df a b c d 0 1 456 12.3 A 1 2 3130 66.7 100 2 3 10422226 84.5 a 3 100 65535 200.2 abc 4 110 65535 300.5 AB 5 200 1970 1200.0 ZA-20
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問