Python 从几十个df.sum()系列中创建一个新的数据帧
我有几个相同格式的数据帧,有五列 我想使用Python 从几十个df.sum()系列中创建一个新的数据帧,python,pandas,dataframe,series,Python,Pandas,Dataframe,Series,我有几个相同格式的数据帧,有五列 我想使用df.sum()对每个数据帧的值求和。这将为每个数据帧创建一个系列,仍然有5列 我的问题是如何获取这些序列并创建另一个数据帧,一列是文件名,另一列是df.sum()中的五列 不幸的是,这种方法行不通df['filename']=str(filename)'抛出一个类型错误,并且创建新的数据帧newdf无法正确解析 如何正确地做到这一点 如何获取多个pandas.Series对象并创建DataFrame 要回答这个具体问题: @ThomasTu我如何从以“
df.sum()
对每个数据帧的值求和。这将为每个数据帧创建一个系列,仍然有5列
我的问题是如何获取这些序列并创建另一个数据帧,一列是文件名,另一列是df.sum()中的五列
不幸的是,这种方法行不通df['filename']=str(filename)'抛出一个类型错误,并且创建新的数据帧newdf
无法正确解析
如何正确地做到这一点
如何获取多个pandas.Series
对象并创建DataFrame
要回答这个具体问题:
@ThomasTu我如何从以“文件名”为名称的系列列表开始
列到数据帧?我想这就是问题所在——我不明白
这个
它本质上就是您现在所拥有的,但不是附加到空列表,而是附加到空数据帧。如果您不想在每次迭代中重新分配newdf,我认为有一个inplace关键字
import pandas as pd
import glob
batch_of_dataframes = glob.glob("*.txt")
newdf = pd.DataFrame()
for filename in batch_of_dataframes:
df = pd.read_csv(filename)
df['filename'] = str(filename)
df = df.sum()
newdf = newdf.append(df, ignore_index=True)
要回答这个具体问题:
@ThomasTu我如何从以“文件名”为名称的系列列表开始
列到数据帧?我想这就是问题所在——我不明白
这个
它本质上就是您现在所拥有的,但不是附加到空列表,而是附加到空数据帧。如果您不想在每次迭代中重新分配newdf,我认为有一个inplace关键字
import pandas as pd
import glob
batch_of_dataframes = glob.glob("*.txt")
newdf = pd.DataFrame()
for filename in batch_of_dataframes:
df = pd.read_csv(filename)
df['filename'] = str(filename)
df = df.sum()
newdf = newdf.append(df, ignore_index=True)
请按以下顺序尝试:
创建一个空列表,比如说list\u of_series
对于每个文件:
加载到数据帧中,然后将总和保存在序列中s
将元素添加到s:s['filename']=您的文件名
将s
附加到系列的列表中
最后,连接(并在需要时转置):
代码
准备:
l_df = [pd.DataFrame(np.random.rand(3,5), columns = list("ABCDE")) for _ in range(5)]
for i, df in enumerate(l_df):
df.to_csv(str(i)+'.txt', index = False)
文件*.txt以逗号分隔,包含标题
! cat 1.txt
A,B,C,D,E
0.18021800981245173,0.29919271590063656,0.09527248614484807,0.9672038093199938,0.07655003742768962
0.35422759068109766,0.04184770882952815,0.682902924462214,0.9400817219440063,0.8825581077493059
0.3762875793116358,0.4745731412494566,0.6545473610147845,0.7479829630649761,0.15641907539706779
事实上,其余部分与您所做的非常相似(我将文件名附加到一个系列中,而不是数据帧中。否则,它们通过sum()
)连接了好几次):
请按以下顺序尝试:
创建一个空列表,比如说list\u of_series
对于每个文件:
加载到数据帧中,然后将总和保存在序列中s
将元素添加到s:s['filename']=您的文件名
将s
附加到系列的列表中
最后,连接(并在需要时转置):
代码
准备:
l_df = [pd.DataFrame(np.random.rand(3,5), columns = list("ABCDE")) for _ in range(5)]
for i, df in enumerate(l_df):
df.to_csv(str(i)+'.txt', index = False)
文件*.txt以逗号分隔,包含标题
! cat 1.txt
A,B,C,D,E
0.18021800981245173,0.29919271590063656,0.09527248614484807,0.9672038093199938,0.07655003742768962
0.35422759068109766,0.04184770882952815,0.682902924462214,0.9400817219440063,0.8825581077493059
0.3762875793116358,0.4745731412494566,0.6545473610147845,0.7479829630649761,0.15641907539706779
事实上,其余部分与您所做的非常相似(我将文件名附加到一个系列中,而不是数据帧中。否则,它们通过sum()
)连接了好几次):
您可以发布一些模拟输入数据帧的示例数据吗?这里有几个问题。1.df.sum()返回包含len(df.columns)
行(或len(df)
的序列,具体取决于axis=0还是1)。序列中没有列。2.新的_df只是一个系列的列表,因此您最终只会得到另一个系列。3.您应该在df['colname']='value'
上发布完整的回溯。这真的不应该失败。这让我觉得,无论出于什么原因,您的数据实际上只是一列,并作为一个系列读入,但发布一些示例数据将澄清这一点。我相信glob.glob('.txt')
返回的是一个空列表。我相信你想要glob.glob('*.txt')
@Alexander抱歉,typo@ThomasTu如何从以“Filename”作为列的系列列表转到数据帧?我想这就是问题所在——我不明白这一点。你能发布一些模拟输入数据帧的示例数据吗?这里有几个问题。1.df.sum()返回包含len(df.columns)
行(或len(df)
的序列,具体取决于axis=0还是1)。序列中没有列。2.新的_df只是一个系列的列表,因此您最终只会得到另一个系列。3.您应该在df['colname']='value'
上发布完整的回溯。这真的不应该失败。这让我觉得,无论出于什么原因,您的数据实际上只是一列,并作为一个系列读入,但发布一些示例数据将澄清这一点。我相信glob.glob('.txt')
返回的是一个空列表。我相信你想要glob.glob('*.txt')
@Alexander抱歉,typo@ThomasTu如何从以“Filename”作为列的系列列表转到数据帧?我想这就是问题所在——我不明白,你能提供代码吗?我相信这大概就是我所拥有的above@ShanZhengYang给你。我可能只是猜测你的pd.read\u csv
出错了:不同格式的文件?或者glob意外地匹配了不需要的文件?如果不是这样的话,我会先在一个文件上运行循环中的三行代码。你能提供代码吗?我相信这大概就是我所拥有的above@ShanZhengYang给你。我可能只是猜测你的pd.read\u csv
出错了:不同格式的文件?或者glob意外地匹配了不需要的文件?如果不是这样的话,我会尝试先在一个文件上运行循环中的三行代码。