我有一个不整洁的 Tweet 对象 DataFrame。有两列包含列表:hashtags
和 expanded_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/