【问题标题】:Python changing values in dataframe after splitting拆分后Python更改数据框中的值
【发布时间】:2020-11-26 16:13:16
【问题描述】:

我的目标是每当“SAD”列中的字符串与列名匹配时输入 1,否则输入 0。

所以我们有这个数据框:

df = pd.DataFrame({'SAD': ['Game;Pool;Read;lol','Game;Read'], 'Game':[0,0], 'Pool': [0, 0], 'Read':[0, 0], 'Drink' : [0, 0]})

我试过这个:拆分然后分配:

l= df["SAD"].apply(lambda x: x.split(";"))

for i in l:
   for x in i:
     if x in df.columns:
        df[x]=1
print(df)

但是,这会在第一次看到匹配的字符串时将整个数据框替换为 1:

                        SAD  Game  Pool  Read  Drink
0        Game;Pool;Read;lol     1     1     1      0
1                 Game;Read     1     1     1      0

期望的输出是:

                            SAD  Game  Pool  Read  Drink
    0        Game;Pool;Read;lol     1     1     1      0
    1                 Game;Read     1     0     1      0

【问题讨论】:

  • 您还需要这里的帮助吗?如果不是,请接受答案,以便可以关闭此问题

标签: python


【解决方案1】:
l= df["SAD"].apply(lambda x: x.split(";"))

for idx, i in enumerate(l):
   for x in i:
     if x in df.columns:
        df.loc[idx,x]=1
print(df)

【讨论】:

    【解决方案2】:

    你能用.iloc这个吗:

    import pandas as pd
    
    df = pd.DataFrame({'SAD': ['Game;Pool;Read;lol','Game;Read'], 'Game':[0,0], 'Pool': [0, 0], 'Read':[0, 0], 'Drink' : [0, 0]})
    
    l= df["SAD"].apply(lambda x: x.split(";"))
    
    n=0
    for i in l:
       for x in i:
         if x in df.columns:
            df[x].iloc[n]=1
       n += 1
    print(df)
    

    【讨论】:

      【解决方案3】:

      我认为您可以采取不同的方法来减少循环

      cols = df.columns[1:].values
      data= df['SAD'].map(lambda x: x.split(';')).map(lambda x: [1 if i in x else 0 for i in cols])
      
      0    [1, 1, 1, 0]
      1    [1, 0, 1, 0]
      

      然后创建数据框

      df = pd.DataFrame(smp.tolist(), columns=cols).assign(SAD=df['SAD'])

         Game  Pool  Read  Drink                 SAD
      0     1     1     1      0  Game;Pool;Read;lol
      1     1     0     1      0           Game;Read
      

      您可以随时重新分配

      【讨论】:

        【解决方案4】:

        您的转贴有点晚,但这是我的代码。它可以完成工作,但不要因为代码混乱而评判我。

        import pandas as pd
        df = pd.DataFrame({'SAD': ['Game;Pool;Read;lol','Game;Read'], 'Game':[0,0], 'Pool': [0, 0], 'Read':[0, 0], 'Drink' : [0, 0]})
        
        ColumnNames = df.columns.tolist()
        
        l= df["SAD"].apply(lambda x: x.split(";"))
        for row in range(0,len(df)):
            for check in l[row]:
                for checkvalue in range (0,len(ColumnNames)):
                    if check == ColumnNames[checkvalue]:
                        df.set_value(index=row, col=ColumnNames[checkvalue],value = 1)
        

        【讨论】:

          猜你喜欢
          • 2021-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-12
          • 2017-12-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多