python - 使用列中的列表整理 DataFrame 的最佳方法

标签 python python-3.x pandas dataframe scikit-learn

我有一个不整洁的 Tweet 对象 DataFrame。有两列包含列表:hashtagsexpanded_urls。我试图通过在行/列索引处仅保留 1 个值来遵循整洁数据原则。

编辑:这个问题被标记为重复 this answer ,它只是将列表拆分为更多列。这对我不起作用,因为 1 条推文中的主题标签数量可能不定。

这是我的 tweet DataFrame 的示例:

-----------------------------------------------------------
tweet_id | hashtags       | expanded_urls
-----------------------------------------------------------
  123    | ['lol','bff']  | ['fakeurl.com']
  124    | []             | ['url1.io', 'url2.expanded.co']

我可以通过两种可能的方式来整理这些数据。

1:只需将新行添加到 DataFrame 中,几乎复制所有行内容:

---------------------------------------------
tweet_id | hashtag   | expanded_url
---------------------------------------------
  123    | 'lol'    | 'fakeurl.com'
  123    | 'bff'    | 'fakeurl.com'
  124    | ''       | 'url1.io'
  124    | ''       | 'url2.expanded.io'

我认为这不会非常有效,尤其是因为会有很多插入/追加操作。但是,将单个 DataFrame 传递到单个 scikit-learn 模型会使事情变得非常简单。

2:创建 2 个新的 DataFrame:

第一个是标签及其相应的 tweet_id:

------------------
tweet_id | hashtag
------------------
123      | `lol`
123      | `bff`

另一个是带有相应 tweet_id 的 url:

------------------
tweet_id | url
------------------
123      | `fakeurl.com`
124      | `url1.io`
124      | `url2.expanded.co`

这看起来更简洁,但我不完全确定我将如何修改原始 DataFrame;我会只删除相应的列并保留 3 个单独的表吗?是否有将这 3 个 DataFrame 合并为 1 个的好方法,或者每次我想知道哪些主题标签与推文相关联时我是否必须单独查找?

最佳答案

我重新分配 df 以将空列表转换为单个空字符串的列表

两列在一起

from itertools import product

df = df.applymap(lambda x: x if x else [''])

pd.DataFrame([
    [t, h, e]
    for t, h_, e_ in df.values
    for h, e in product(h_, e_)
], columns=df.columns)

   tweet_id hashtags     expanded_urls
0       123      lol       fakeurl.com
1       123      bff       fakeurl.com
2       124                    url1.io
3       124           url2.expanded.co

或者没有 itertools

df = df.applymap(lambda x: x if x else [''])

pd.DataFrame([
    [t, h, e]
    for t, h_, e_ in df.values
    for h in h_ for e in e_
], columns=df.columns)

   tweet_id hashtags     expanded_urls
0       123      lol       fakeurl.com
1       123      bff       fakeurl.com
2       124                    url1.io
3       124           url2.expanded.co

分别

pd.DataFrame(dict(
    tweet_id=df.tweet_id.values.repeat(df.hashtags.str.len()),
    hashtags=np.concatenate(df.hashtags.values)
), columns=['tweet_id', 'hashtags'])

   tweet_id hashtags
0       123      lol
1       123      bff

pd.DataFrame(dict(
    tweet_id=df.tweet_id.values.repeat(df.expanded_urls.str.len()),
    expanded_urls=np.concatenate(df.expanded_urls.values)
), columns=['tweet_id', 'expanded_urls'])

   tweet_id     expanded_urls
0       123       fakeurl.com
1       124           url1.io
2       124  url2.expanded.co

关于python - 使用列中的列表整理 DataFrame 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49291593/

相关文章:

python - NumPy 沿多维数组轴的最近值

python - 重新排列数据帧的索引以将字符串移至顶部

Python:Pygame 安装但运行不佳(如果有的话)。 (麦克,莫哈维)

python - 将列添加到包含跨行的复杂逻辑的 Python pandas 数据框中

python - 将列表转换为 Pandas 数据框中的集合

python - 使用python检测日志文件中是否存在csv列中的字符串?

python - 在 Python 中访问远程服务器上的 Windows 共享驱动器

python - 使用正则表达式隔离文件名中的信息

python - 如何不可知论地链接来自另一个 Django 模型的任何对象/模型?

python - 在python中分组交易描述和计数