熊猫数据框如何将对象转换为数组并提取数组值
Posted
技术标签:
【中文标题】熊猫数据框如何将对象转换为数组并提取数组值【英文标题】:pandas dataframe how to convert object to array and extract the array value 【发布时间】:2020-02-23 18:42:38 【问题描述】:如果我的问题有点模棱两可,请原谅我。会努力成为更好的初级bb。
问题。
我有如下从 hive DB 收到的 DataFrame。
如何在 col2 列中提取值 'cat' 和 'animal'、'dog' 等等。
In[]:
sample = 'col1': ['cat', 'dog'], 'col2': ['WrappedArray([animal], [cat])', 'WrappedArray([animal], [dog])']
df = pd.DataFrame(data=sample)
df
out[] :
col1 col2
-----------------------------------------
0 cat WrappedArray([animal], [cat])
1 dog WrappedArray([animal], [dog])
我尝试将对象转换为数组并像这段代码一样提取数据。
In[]: df['col2'][0][1]
Out[]: cat
如果我错了,我必须尝试另一种方法,因为我是 Pandas Dataframe 的新手。 有人可以告诉我是如何工作的吗?
提前致谢。
【问题讨论】:
“WrappedArray()”从何而来?这就是你获取数据的方式吗?我猜你实际上并没有创建这样的数据集,你只是在为自己做更多的工作。 @elPastor 是的,我没有创建数据框,这是我从数据库中收到的。 你是如何从数据库中读取数据的? 不确定这是否有帮助。 ***.com/questions/44468311/…。看起来WrappedArray
是火花类型。
@TomRon 选择的数据。该列由一个数组组成。这是列类型的方式: col1 array第二列col2
中的数据似乎只是字符串。
df['col2'][0][1]
的输出将是 "r"
,这是第一个字符串中的第二个字符(索引 1)。要获得"cat"
,您需要更改字符串并删除'WrappedArray([animal]...'
的东西。只留下实际数据。 “猫”、“狗”等
您可以尝试df['col2'].iloc[0][24:27]
,但这不是一个通用的解决方案。它也很脆弱且无法维护。
如果您对从数据库导出数据的方式有任何控制权,请尝试以更清晰的格式导出数据,即没有WrappedArray(...
的东西。
正则表达式在这里可能会有所帮助。
你可以试试这样的:
import re
wrapped = re.compile(r'\[(.*?)\].+\[(.*?)\]')
element = wrapped.search(df['col2'].iloc[0]).group(2)
* 危险危险危险*
如果您需要该功能。您可以创建一个 WrappedArray
函数,将内容作为字符串列表等返回。然后你可以使用eval(df['col2'][0][1])
调用它。
不要这样做。
仅供参考:
您的 dtypes 可能默认为 object,因为您在创建数据框时没有指定它们。你可以这样做:
df = pd.DataFrame(data=sample, dtype='string')
另外,建议使用 iloc 按索引索引数据帧。
【讨论】:
【参考方案2】:我按照@rkedge 的建议解决了这个问题
数据是用外语编写的。
正如我所说,DataFrame 具有使用“WrappedArray([우주ごぎゅ],[ぎゃ],[한국어])”编写的对象数据。
df_ = df['col2'].str.extractall(r'([REGEX expression]+)')
df_
0 0 우주ごぎゅ
0 1 ぎゃ
0 2 한국어
1 0 cat
2 0 animal
【讨论】:
以上是关于熊猫数据框如何将对象转换为数组并提取数组值的主要内容,如果未能解决你的问题,请参考以下文章