如何将单个列中的不同数据重新定位到各自的列中?

ecr0jaav  于 2022-09-21  发布在  其他
关注(0)|答案(2)|浏览(148)

我有一个 Dataframe ,它的数据是字符串,不同的信息混合在一个列中。就像这样:
||

0|地点:House
1|日期/时间:01/02/03 09:30
2|颜色:黄色
3|地点:Street
4|日期/时间:12-12-13 13:21:21
5|颜色:红色

df = pd.DataFrame(['Place: House','Date/Time: 01/02/03 at 09:30', 'Color:Yellow', 'Place: Street','Date/Time: 21/12/13 at 13:21:21', 'Color:Red'])

我需要这样的 Dataframe :

Place|日期/时间|颜色
-|-|
HOUSE|01-02/03|黄色
街道|2013年12月21日|红色

我首先将EXCEL文件转换为CSV,然后尝试按如下方式打开它:

df = pd.read_csv(filename, sep=":")

我尝试使用“:”分隔各列,但时间格式也使用“:”,因此不起作用。时间不是重要的信息,所以我甚至试着删除它并保留日期,但我也找不到一种方法来不影响专栏中的其他信息。

zmeyuzjn

zmeyuzjn1#

给定数据中的值,您将需要将拆分限制为只发生一次,这可以使用Split的n参数来实现。您可以将拆分值展开为两列,然后透视。

这里的诀窍是以df.index // 3为索引创建一个分组,这样每3行就在一个新的组中。

df = pd.DataFrame(['Place: House','Date/Time: 01/02/03 at 09:30', 'Color:Yellow', 'Place: Street','Date/Time: 21/12/13 at 13:21:21', 'Color:Red'])

df = df[0].str.split(':', n=1, expand=True)
df['idx'] = df.index//3
df.pivot(index='idx', columns=0, values=1).reset_index().drop(columns='idx')[['Place','Date/Time','Color']]

输出

0    Place              Date/Time   Color
0    House      01/02/03 at 09:30  Yellow
1   Street   21/12/13 at 13:21:21     Red
j0pj023g

j0pj023g2#

您的数据都是字符串,在将其带回Pandas之前,您可能会在普通的Python中对其进行处理,从而获得更好的性能;唯一可能在Pandas中获得更好的字符串性能的情况是,如果您使用的是pyrow字符串数据类型。

from collections import defaultdict
out = df.squeeze().tolist() # this works since it is just one column
frame = defaultdict(list)
for entry in out:
    key, value = entry.split(':', maxsplit=1)
    if key == "Date/Time":
        value = value.split('at')[0]
    value = value.strip()
    key = key.strip() # not really necessary
    frame[key].append(value)
pd.DataFrame(frame)
    Place Date/Time   Color
0   House  01/02/03  Yellow
1  Street  21/12/13     Red

相关问题