【问题标题】:How to split a column in a data frame containing only numbers into multiple columns in pandas如何将仅包含数字的数据框中的列拆分为熊猫中的多列
【发布时间】:2020-01-24 07:07:47
【问题描述】:

我有一个包含以下数据的 .dat 文件:

0001100000101010100
110101000001111
101100011001110111
0111111010100
1010111111100011

需要计算每行中0和1的数量

我已经尝试过使用 Pandas。

  • 第一步:读取数据文件
  • 第 2 步:给定列名
  • 步骤 3:尝试将值拆分为多列。但可以 不成功

df1=pd.read_csv('data.dat',header=None) df1.head()
                 0   1100000101010100

1   110101000001111
2   101100011001110111
3   111111010100
4   1010111111100011

df1.columns=['kirti']
df1.head()
        Kirti
_______________________
0   1100000101010100
1   110101000001111
2   101100011001110111
3   111111010100
4   1010111111100011

我需要根据每行中的 0 和 1 将数据框拆分为多列。

最大列数将等于数据框中任何行中的最大零和一。

【问题讨论】:

  • 你能提供你期望的输出吗
  • 首先,您可能应该将文件作为字符串读取,否则您将在开头丢失“0”。对于字符串,有 count 方法。 mystr.count("0") 将给出 mystr 中“0”的个数。
  • COL1 | COL2 | COL3| .......|COLN ----------------------------------------- ---- ROW0 1 | 1 | 0 | ......| 0 ------------------------------------------------- ------- ROW1 1 | 1 | 0 | ......| 1

标签: pandas dataframe data-analysis data-processing


【解决方案1】:

首先通过参数namesdtype=str创建一列DataFrame用于将列转换为字符串:

import pandas as pd

temp="""0001100000101010100
110101000001111
101100011001110111
0111111010100
1010111111100011"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename'
df = pd.read_csv(StringIO(temp), header=None, names=['kirti'], dtype=str)

print (df)
                 kirti
0  0001100000101010100
1      110101000001111
2   101100011001110111
3        0111111010100
4     1010111111100011

然后通过将值转换为lists 来创建新的DataFrame

df = pd.DataFrame([list(x) for x in df['kirti']])
print (df)

   0  1  2  3  4  5  6  7  8  9 10 11 12    13    14    15    16    17    18
0  0  0  0  1  1  0  0  0  0  0  1  0  1     0     1     0     1     0     0
1  1  1  0  1  0  1  0  0  0  0  0  1  1     1     1  None  None  None  None
2  1  0  1  1  0  0  0  1  1  0  0  1  1     1     0     1     1     1  None
3  0  1  1  1  1  1  1  0  1  0  1  0  0  None  None  None  None  None  None
4  1  0  1  0  1  1  1  1  1  1  1  0  0     0     1     1  None  None  None

【讨论】:

    【解决方案2】:

    如果您的数据在字符串列表中,则使用count 方法:

    >> data = ["0001100000101010100", "110101000001111", "101100011001110111", "0111111010100", "1010111111100011"]
    >> for i in data:
        print(i.count("0"))
    
    13
    7
    7
    5
    5
    

    如果您的数据位于 .dat 文件中,如您所描述的那样使用空格分隔,那么我建议您按如下方式加载数据:

    data = pd.read_csv("data.dat", lineterminator=" ",dtype="str", header=None, names=["Kirti"])
        Kirti
    0   0001100000101010100
    1   110101000001111
    2   101100011001110111
    3   0111111010100
    4   1010111111100011
    

    lineterminator 参数确保每个条目都位于新行中。 dtype 参数确保它被读取为字符串。否则你会丢失前导零。

    如果你的数据在DataFrame中,你可以使用count方法(灵感来自here):

    >> data["Kirti"].str.count("0")
    0    13
    1     7
    2     7
    3     5
    4     5
    Name: Kirti, dtype: int64
    

    【讨论】:

    • 数据文件中的数据是
    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多